143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala/* 243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * 443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * you may not use this file except in compliance with the License. 643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * You may obtain a copy of the License at 743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * 843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * 1043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * See the License for the specific language governing permissions and 1443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala * limitations under the License. 1543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala */ 1643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 1743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#define LOG_TAG "Camera2-StreamingProcessor" 1843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 1943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala//#define LOG_NDEBUG 0 204a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala//#define LOG_NNDEBUG 0 // Per-frame verbose logging 214a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala 224a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala#ifdef LOG_NNDEBUG 234a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__) 244a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala#else 254a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala#define ALOGVV(...) ((void)0) 264a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala#endif 2743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 28d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala#include <cutils/properties.h> 2943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#include <utils/Log.h> 3043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala#include <utils/Trace.h> 31549e735c2ca22d16eea32fda418ba80da32a8558Dan Stoza#include <gui/BufferItem.h> 32b1e7cd156ca3e1747374e0d20cdd1ce467210453Mathias Agopian#include <gui/Surface.h> 33d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala#include <media/hardware/HardwareAPI.h> 3443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h" 367b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h" 377b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/StreamingProcessor.h" 387b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/Camera2Heap.h" 3943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 4043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalanamespace android { 4143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalanamespace camera2 { 4243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 4302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville TalvalaStreamingProcessor::StreamingProcessor(sp<Camera2Client> client): 4443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mClient(client), 4502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala mDevice(client->getCameraDevice()), 4602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala mId(client->getCameraId()), 474c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mActiveRequest(NONE), 485282713a976184e41451315f1286d8075b257d58Igor Murashkin mPaused(false), 494c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mPreviewRequestId(Camera2Client::kPreviewRequestIdStart), 5043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mPreviewStreamId(NO_STREAM), 514c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mRecordingRequestId(Camera2Client::kRecordingRequestIdStart), 528cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen mRecordingStreamId(NO_STREAM) 5343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala{ 5443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 5543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 5643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville TalvalaStreamingProcessor::~StreamingProcessor() { 5743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala deletePreviewStream(); 5843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala deleteRecordingStream(); 5943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 6043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 61727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvalastatus_t StreamingProcessor::setPreviewWindow(sp<Surface> window) { 6243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 6343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 6443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 6543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = deletePreviewStream(); 6643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) return res; 6743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 6843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 6943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 7043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mPreviewWindow = window; 7143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 7243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 7343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 7443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 758cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenstatus_t StreamingProcessor::setRecordingWindow(sp<Surface> window) { 768cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ATRACE_CALL(); 778cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen status_t res; 788cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 798cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen res = deleteRecordingStream(); 808cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (res != OK) return res; 818cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 828cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen Mutex::Autolock m(mMutex); 838cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 848cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen mRecordingWindow = window; 858cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 868cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return OK; 878cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen} 888cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 8943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalabool StreamingProcessor::haveValidPreviewWindow() const { 9043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 9143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mPreviewWindow != 0; 9243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 9343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 948cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenbool StreamingProcessor::haveValidRecordingWindow() const { 958cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen Mutex::Autolock m(mMutex); 968cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return mRecordingWindow != nullptr; 978cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen} 988cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 9943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::updatePreviewRequest(const Parameters ¶ms) { 10043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 10143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 10202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 10302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 10402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 10502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 10602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 10743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 10843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 10943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mPreviewRequest.entryCount() == 0) { 1100ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He sp<Camera2Client> client = mClient.promote(); 1110ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He if (client == 0) { 1120ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId); 1130ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He return INVALID_OPERATION; 1140ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } 1150ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He 1160ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He // Use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG for ZSL streaming case. 1170ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He if (client->getCameraDeviceVersion() >= CAMERA_DEVICE_API_VERSION_3_0) { 1180ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He if (params.zslMode && !params.recordingHint) { 1190ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He res = device->createDefaultRequest(CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG, 1200ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He &mPreviewRequest); 1210ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } else { 1220ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He res = device->createDefaultRequest(CAMERA3_TEMPLATE_PREVIEW, 1230ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He &mPreviewRequest); 1240ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } 1250ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } else { 1260ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He res = device->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 1270ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He &mPreviewRequest); 1280ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He } 1290ea8fa4ccbf9b2b179370b983f3887d3daf2381fZhijun He 13043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 13143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default preview request: " 13202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "%s (%d)", __FUNCTION__, mId, strerror(-res), res); 13343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 13443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 13543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 13643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 13743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = params.updateRequest(&mPreviewRequest); 13843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 13943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of preview " 14002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, mId, 14143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 14243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 14343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 14443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 14543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = mPreviewRequest.update(ANDROID_REQUEST_ID, 1464c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala &mPreviewRequestId, 1); 1474c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) { 1484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update request id for preview: %s (%d)", 14902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 1504c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return res; 1514c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 15243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 15343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 15443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 15543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 15643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::updatePreviewStream(const Parameters ¶ms) { 15743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 15843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 15943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 16043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 16102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 16202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 16302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 16402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 16502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 16643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 16743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 16843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala // Check if stream parameters have to change 16943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala uint32_t currentWidth, currentHeight; 17043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->getStreamInfo(mPreviewStreamId, 171d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala ¤tWidth, ¤tHeight, 0, 0); 17243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 17343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying preview stream info: " 17402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "%s (%d)", __FUNCTION__, mId, strerror(-res), res); 17543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 17643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 17743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (currentWidth != (uint32_t)params.previewWidth || 17843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala currentHeight != (uint32_t)params.previewHeight) { 17943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 18002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, currentWidth, currentHeight, 18143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala params.previewWidth, params.previewHeight); 18243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->waitUntilDrained(); 18343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 18443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Error waiting for preview to drain: " 18502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "%s (%d)", __FUNCTION__, mId, strerror(-res), res); 18643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 18743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 18843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->deleteStream(mPreviewStreamId); 18943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 19043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 19102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "for preview: %s (%d)", __FUNCTION__, mId, 19243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 19343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 19443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 19543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mPreviewStreamId = NO_STREAM; 19643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 19743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 19843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 19943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mPreviewStreamId == NO_STREAM) { 20043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->createStream(mPreviewWindow, 20143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala params.previewWidth, params.previewHeight, 2023d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, HAL_DATASPACE_UNKNOWN, 203b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh CAMERA3_STREAM_ROTATION_0, &mPreviewStreamId); 20443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 20543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 20602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 20743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 20843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 20943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 21043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 21143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->setStreamTransform(mPreviewStreamId, 21243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala params.previewTransform); 21343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 21443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview stream transform: " 21502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "%s (%d)", __FUNCTION__, mId, strerror(-res), res); 21643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 21743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 21843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 21943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 22043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 22143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 22243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::deletePreviewStream() { 22343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 22443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 22543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 22643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 22743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 22843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mPreviewStreamId != NO_STREAM) { 22902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 23002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 23102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 23202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 23302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 23443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 2358dcdb9553defafa1166c64b496e1ee390e4eadfaIgor Murashkin ALOGV("%s: for cameraId %d on streamId %d", 23602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, mPreviewStreamId); 2378dcdb9553defafa1166c64b496e1ee390e4eadfaIgor Murashkin 23843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->waitUntilDrained(); 23943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 24043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Error waiting for preview to drain: %s (%d)", 24143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 24243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 24343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 24443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->deleteStream(mPreviewStreamId); 24543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 24643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Unable to delete old preview stream: %s (%d)", 24743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 24843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 24943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 25043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mPreviewStreamId = NO_STREAM; 25143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 25243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 25343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 25443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 2554c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaint StreamingProcessor::getPreviewStreamId() const { 25643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 25743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mPreviewStreamId; 25843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 25943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 26043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::updateRecordingRequest(const Parameters ¶ms) { 26143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 26243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 26343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 26443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 26502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 26602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 26702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 26802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 26902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 27043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 27143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mRecordingRequest.entryCount() == 0) { 27202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala res = device->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 27343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala &mRecordingRequest); 27443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 27543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default recording request:" 27602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala " %s (%d)", __FUNCTION__, mId, strerror(-res), res); 27743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 27843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 27943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 28043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 28143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = params.updateRequest(&mRecordingRequest); 28243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 28343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of recording " 28402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, mId, 28543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 28643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 28743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 28843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 2894c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = mRecordingRequest.update(ANDROID_REQUEST_ID, 2904c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala &mRecordingRequestId, 1); 2914c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (res != OK) { 2924c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update request id for request: %s (%d)", 29302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 2944c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return res; 2954c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 2964c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 29743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 29843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 29943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 300a53021f776d0c82271727e5817388936513feb92Yin-Chia Yehstatus_t StreamingProcessor::recordingStreamNeedsUpdate( 301a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh const Parameters ¶ms, bool *needsUpdate) { 302a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh status_t res; 303a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 304a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (needsUpdate == 0) { 305a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh ALOGE("%s: Camera %d: invalid argument", __FUNCTION__, mId); 306a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return INVALID_OPERATION; 307a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 308a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 309a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (mRecordingStreamId == NO_STREAM) { 310a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh *needsUpdate = true; 311a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return OK; 312a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 313a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 314a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh sp<CameraDeviceBase> device = mDevice.promote(); 315a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (device == 0) { 316a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 317a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return INVALID_OPERATION; 318a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 319a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 320d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t currentWidth, currentHeight, currentFormat; 321d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala android_dataspace currentDataSpace; 322a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh res = device->getStreamInfo(mRecordingStreamId, 323d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala ¤tWidth, ¤tHeight, ¤tFormat, ¤tDataSpace); 324a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh if (res != OK) { 325a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh ALOGE("%s: Camera %d: Error querying recording output stream info: " 326a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh "%s (%d)", __FUNCTION__, mId, 327a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh strerror(-res), res); 328a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return res; 329a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 330a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 3318cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (mRecordingWindow == nullptr || 332d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala currentWidth != (uint32_t)params.videoWidth || 333d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala currentHeight != (uint32_t)params.videoHeight || 3348cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen currentFormat != (uint32_t)params.videoFormat || 3358cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen currentDataSpace != params.videoDataSpace) { 336a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh *needsUpdate = true; 337855c20283de5eab6798c76ffd4ea86bd6754a7fbYin-Chia Yeh return res; 338a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh } 339a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh *needsUpdate = false; 340a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh return res; 341a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh} 342a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh 34343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::updateRecordingStream(const Parameters ¶ms) { 34443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 34543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 34643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 34743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 34802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 34902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 35002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 35102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 35202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 35343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 35443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 35543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala // Check if stream parameters have to change 35643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala uint32_t currentWidth, currentHeight; 357d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t currentFormat; 358d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala android_dataspace currentDataSpace; 35943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->getStreamInfo(mRecordingStreamId, 360d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala ¤tWidth, ¤tHeight, 361d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala ¤tFormat, ¤tDataSpace); 36243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 36343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying recording output stream info: " 36402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "%s (%d)", __FUNCTION__, mId, 36543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 36643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 36743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 36843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (currentWidth != (uint32_t)params.videoWidth || 369d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala currentHeight != (uint32_t)params.videoHeight || 3708cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen currentFormat != (uint32_t)params.videoFormat || 3718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen currentDataSpace != params.videoDataSpace) { 37243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala // TODO: Should wait to be sure previous recording has finished 37343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->deleteStream(mRecordingStreamId); 37482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin 37582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin if (res == -EBUSY) { 37682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin ALOGV("%s: Camera %d: Device is busy, call " 37782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin "updateRecordingStream after it becomes idle", 37882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin __FUNCTION__, mId); 37982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin return res; 38082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin } else if (res != OK) { 38143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 38243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala "for recording: %s (%d)", __FUNCTION__, 38302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala mId, strerror(-res), res); 38443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 38543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 38643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mRecordingStreamId = NO_STREAM; 38743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 38843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 38943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 39043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mRecordingStreamId == NO_STREAM) { 39143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->createStream(mRecordingWindow, 39243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala params.videoWidth, params.videoHeight, 3938cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen params.videoFormat, params.videoDataSpace, 394b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh CAMERA3_STREAM_ROTATION_0, &mRecordingStreamId); 39543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 39643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for recording: " 39702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala "%s (%d)", __FUNCTION__, mId, 39843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala strerror(-res), res); 39943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 40043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 40143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 40243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 40343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 40443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 40543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 40643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::deleteRecordingStream() { 40743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 40843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 40943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 41043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 41143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 41243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mRecordingStreamId != NO_STREAM) { 41302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 41402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 41502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 41602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 41702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 41843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 41943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->waitUntilDrained(); 42043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 42143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Error waiting for HAL to drain: %s (%d)", 42243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 42343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 42443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 42543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->deleteStream(mRecordingStreamId); 42643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 42743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Unable to delete recording stream: %s (%d)", 42843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 42943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 43043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 43143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mRecordingStreamId = NO_STREAM; 43243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 43343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 43443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 43543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 4364c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaint StreamingProcessor::getRecordingStreamId() const { 43743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return mRecordingStreamId; 43843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 43943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 44043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::startStream(StreamType type, 441d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He const Vector<int32_t> &outputStreams) { 44243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 44343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 44443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 4454c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (type == NONE) return INVALID_OPERATION; 4464c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 44702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 44802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 44902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 45002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 45102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 45243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 45302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGV("%s: Camera %d: type = %d", __FUNCTION__, mId, type); 4540cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin 45543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala Mutex::Autolock m(mMutex); 45643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 45743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala CameraMetadata &request = (type == PREVIEW) ? 45843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mPreviewRequest : mRecordingRequest; 45943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 46043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = request.update( 46143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ANDROID_REQUEST_OUTPUT_STREAMS, 46243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala outputStreams); 46343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 46443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 46502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 46643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 46743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 46843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 46943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = request.sort(); 47043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 47143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 47202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 47343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 47443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 47543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 47602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala res = device->setStreamingRequest(request); 47743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 47843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 47943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala "%s (%d)", 48002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 48143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 48243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 4834c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mActiveRequest = type; 4845282713a976184e41451315f1286d8075b257d58Igor Murashkin mPaused = false; 4854a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala mActiveStreamIds = outputStreams; 48643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 48743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 48843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 4895282713a976184e41451315f1286d8075b257d58Igor Murashkinstatus_t StreamingProcessor::togglePauseStream(bool pause) { 4905282713a976184e41451315f1286d8075b257d58Igor Murashkin ATRACE_CALL(); 4915282713a976184e41451315f1286d8075b257d58Igor Murashkin status_t res; 4925282713a976184e41451315f1286d8075b257d58Igor Murashkin 4935282713a976184e41451315f1286d8075b257d58Igor Murashkin sp<CameraDeviceBase> device = mDevice.promote(); 4945282713a976184e41451315f1286d8075b257d58Igor Murashkin if (device == 0) { 4955282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 4965282713a976184e41451315f1286d8075b257d58Igor Murashkin return INVALID_OPERATION; 4975282713a976184e41451315f1286d8075b257d58Igor Murashkin } 4985282713a976184e41451315f1286d8075b257d58Igor Murashkin 4995282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGV("%s: Camera %d: toggling pause to %d", __FUNCTION__, mId, pause); 5005282713a976184e41451315f1286d8075b257d58Igor Murashkin 5015282713a976184e41451315f1286d8075b257d58Igor Murashkin Mutex::Autolock m(mMutex); 5025282713a976184e41451315f1286d8075b257d58Igor Murashkin 5035282713a976184e41451315f1286d8075b257d58Igor Murashkin if (mActiveRequest == NONE) { 5045282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Can't toggle pause, streaming was not started", 5055282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mId); 5065282713a976184e41451315f1286d8075b257d58Igor Murashkin return INVALID_OPERATION; 5075282713a976184e41451315f1286d8075b257d58Igor Murashkin } 5085282713a976184e41451315f1286d8075b257d58Igor Murashkin 5095282713a976184e41451315f1286d8075b257d58Igor Murashkin if (mPaused == pause) { 5105282713a976184e41451315f1286d8075b257d58Igor Murashkin return OK; 5115282713a976184e41451315f1286d8075b257d58Igor Murashkin } 5125282713a976184e41451315f1286d8075b257d58Igor Murashkin 5135282713a976184e41451315f1286d8075b257d58Igor Murashkin if (pause) { 5145282713a976184e41451315f1286d8075b257d58Igor Murashkin res = device->clearStreamingRequest(); 5155282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 5165282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Can't clear stream request: %s (%d)", 5175282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mId, strerror(-res), res); 5185282713a976184e41451315f1286d8075b257d58Igor Murashkin return res; 5195282713a976184e41451315f1286d8075b257d58Igor Murashkin } 5205282713a976184e41451315f1286d8075b257d58Igor Murashkin } else { 5215282713a976184e41451315f1286d8075b257d58Igor Murashkin CameraMetadata &request = 5225282713a976184e41451315f1286d8075b257d58Igor Murashkin (mActiveRequest == PREVIEW) ? mPreviewRequest 5235282713a976184e41451315f1286d8075b257d58Igor Murashkin : mRecordingRequest; 5245282713a976184e41451315f1286d8075b257d58Igor Murashkin res = device->setStreamingRequest(request); 5255282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res != OK) { 5265282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGE("%s: Camera %d: Unable to set preview request to resume: " 5275282713a976184e41451315f1286d8075b257d58Igor Murashkin "%s (%d)", 5285282713a976184e41451315f1286d8075b257d58Igor Murashkin __FUNCTION__, mId, strerror(-res), res); 5295282713a976184e41451315f1286d8075b257d58Igor Murashkin return res; 5305282713a976184e41451315f1286d8075b257d58Igor Murashkin } 5315282713a976184e41451315f1286d8075b257d58Igor Murashkin } 5325282713a976184e41451315f1286d8075b257d58Igor Murashkin 5335282713a976184e41451315f1286d8075b257d58Igor Murashkin mPaused = pause; 5345282713a976184e41451315f1286d8075b257d58Igor Murashkin return OK; 5355282713a976184e41451315f1286d8075b257d58Igor Murashkin} 5365282713a976184e41451315f1286d8075b257d58Igor Murashkin 53743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvalastatus_t StreamingProcessor::stopStream() { 53843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ATRACE_CALL(); 53943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala status_t res; 54043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 5414c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala Mutex::Autolock m(mMutex); 5424c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 54302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala sp<CameraDeviceBase> device = mDevice.promote(); 54402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala if (device == 0) { 54502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 54602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala return INVALID_OPERATION; 54702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala } 54843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 54943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala res = device->clearStreamingRequest(); 55043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (res != OK) { 55143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala ALOGE("%s: Camera %d: Can't clear stream request: %s (%d)", 55202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala __FUNCTION__, mId, strerror(-res), res); 55343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return res; 55443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 55502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala 5564c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mActiveRequest = NONE; 5574a5c009bc2389304cf078c270bceb656479367d2Eino-Ville Talvala mActiveStreamIds.clear(); 5585282713a976184e41451315f1286d8075b257d58Igor Murashkin mPaused = false; 5594c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 5604c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return OK; 5614c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 5624c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 5634c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaint32_t StreamingProcessor::getActiveRequestId() const { 5644c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala Mutex::Autolock m(mMutex); 5654c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala switch (mActiveRequest) { 5664c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala case NONE: 5674c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return 0; 5684c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala case PREVIEW: 5694c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mPreviewRequestId; 5704c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala case RECORD: 5714c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return mRecordingRequestId; 5724c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala default: 5734c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ALOGE("%s: Unexpected mode %d", __FUNCTION__, mActiveRequest); 5744c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala return 0; 5754c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 5764c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala} 5774c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 5784c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t StreamingProcessor::incrementStreamingIds() { 5794c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala ATRACE_CALL(); 5804c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala Mutex::Autolock m(mMutex); 5814c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala 5824c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mPreviewRequestId++; 5834c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (mPreviewRequestId >= Camera2Client::kPreviewRequestIdEnd) { 5844c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mPreviewRequestId = Camera2Client::kPreviewRequestIdStart; 5854c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 5864c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mRecordingRequestId++; 5874c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (mRecordingRequestId >= Camera2Client::kRecordingRequestIdEnd) { 5884c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mRecordingRequestId = Camera2Client::kRecordingRequestIdStart; 58943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 59043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 59143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 59243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 593ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinstatus_t StreamingProcessor::dump(int fd, const Vector<String16>& /*args*/) { 59443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala String8 result; 59543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 59643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala result.append(" Current requests:\n"); 59743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mPreviewRequest.entryCount() != 0) { 59843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala result.append(" Preview request:\n"); 59943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala write(fd, result.string(), result.size()); 60043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mPreviewRequest.dump(fd, 2, 6); 6015282713a976184e41451315f1286d8075b257d58Igor Murashkin result.clear(); 60243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } else { 60343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala result.append(" Preview request: undefined\n"); 60443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 60543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 60643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala if (mRecordingRequest.entryCount() != 0) { 60743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala result = " Recording request:\n"; 60843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala write(fd, result.string(), result.size()); 60943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala mRecordingRequest.dump(fd, 2, 6); 6105282713a976184e41451315f1286d8075b257d58Igor Murashkin result.clear(); 61143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } else { 61243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala result = " Recording request: undefined\n"; 61343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala } 61443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 6155282713a976184e41451315f1286d8075b257d58Igor Murashkin const char* streamTypeString[] = { 6165282713a976184e41451315f1286d8075b257d58Igor Murashkin "none", "preview", "record" 6175282713a976184e41451315f1286d8075b257d58Igor Murashkin }; 6185282713a976184e41451315f1286d8075b257d58Igor Murashkin result.append(String8::format(" Active request: %s (paused: %s)\n", 6195282713a976184e41451315f1286d8075b257d58Igor Murashkin streamTypeString[mActiveRequest], 6205282713a976184e41451315f1286d8075b257d58Igor Murashkin mPaused ? "yes" : "no")); 6215282713a976184e41451315f1286d8075b257d58Igor Murashkin 6225282713a976184e41451315f1286d8075b257d58Igor Murashkin write(fd, result.string(), result.size()); 6235282713a976184e41451315f1286d8075b257d58Igor Murashkin 62443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala return OK; 62543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala} 62643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala 62743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala}; // namespace camera2 62843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala}; // namespace android 629