1a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* 2a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Copyright (c) 2011-2012 Code Aurora Forum. All rights reserved. 3a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 4a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Licensed under the Apache License, Version 2.0 (the "License"); 5a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** you may not use this file except in compliance with the License. 6a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** You may obtain a copy of the License at 7a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 8a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** http://www.apache.org/licenses/LICENSE-2.0 9a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 10a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Unless required by applicable law or agreed to in writing, software 11a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** distributed under the License is distributed on an "AS IS" BASIS, 12a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** See the License for the specific language governing permissions and 14a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** limitations under the License. 15a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang*/ 16a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 17a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/*#error uncomment this for compiler test!*/ 18a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 19a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define ALOG_NDEBUG 0 20a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define ALOG_NIDEBUG 0 21a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define LOG_TAG __FILE__ 22a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/Log.h> 23a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/threads.h> 24a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 25a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHWI.h" 26a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraStream.h" 27a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 28a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* QCameraStream class implementation goes here*/ 29a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* following code implement the control logic of this class*/ 30a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 31a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangnamespace android { 32a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 33a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangStreamQueue::StreamQueue(){ 34a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInitialized = false; 35a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 36a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 37a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangStreamQueue::~StreamQueue(){ 38a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang flush(); 39a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 40a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 41a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid StreamQueue::init(){ 42a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock l(&mQueueLock); 43a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInitialized = true; 44a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mQueueWait.signal(); 45a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 46a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 47a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid StreamQueue::deinit(){ 48a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock l(&mQueueLock); 49a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInitialized = false; 50a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mQueueWait.signal(); 51a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 52a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 53a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangbool StreamQueue::isInitialized(){ 54a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock l(&mQueueLock); 55a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return mInitialized; 56a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 57a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 58a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangbool StreamQueue::enqueue( 59a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang void * element){ 60a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock l(&mQueueLock); 61a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mInitialized == false) 62a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return false; 63a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 64a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mContainer.add(element); 65a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mQueueWait.signal(); 66a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return true; 67a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 68a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 69a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangbool StreamQueue::isEmpty(){ 70a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return (mInitialized && mContainer.isEmpty()); 71a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 72a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid* StreamQueue::dequeue(){ 73a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 74a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang void *frame; 75a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mQueueLock.lock(); 76a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang while(mInitialized && mContainer.isEmpty()){ 77a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mQueueWait.wait(mQueueLock); 78a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 79a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 80a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(!mInitialized){ 81a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mQueueLock.unlock(); 82a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NULL; 83a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 84a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 85a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang frame = mContainer.itemAt(0); 86a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mContainer.removeAt(0); 87a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mQueueLock.unlock(); 88a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return frame; 89a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 90a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 91a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid StreamQueue::flush(){ 92a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock l(&mQueueLock); 93a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mContainer.clear(); 94a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 95a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 96a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 97a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 98a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream 99a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 100a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 101a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid superbuf_cb_routine(mm_camera_super_buf_t *bufs, 102a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang void *userdata) 103a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 104a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang QCameraHardwareInterface *p_obj=(QCameraHardwareInterface*) userdata; 105a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: E",__func__); 106a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 107a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang //Implement call to JPEG routine in Snapshot here 108a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(bufs->bufs[0]->stream_id == p_obj->mStreamSnapMain->mMmStreamId){ 109a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s : jpeg callback for MM_CAMERA_SNAPSHOT_MAIN", __func__); 110a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_obj->mStreamSnapMain->receiveRawPicture(bufs); 111a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 112a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 113a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 114a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for(int i=0;i<bufs->num_bufs;i++) { 115a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 116a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_obj->mCameraHandle->ops->qbuf(p_obj->mCameraHandle->camera_handle, 117a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_obj->mChannelId, 118a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang bufs->bufs[i]); 119a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 120a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 121a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 122a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 123a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 124a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 125a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid stream_cb_routine(mm_camera_super_buf_t *bufs, 126a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang void *userdata) 127a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 128a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s E ", __func__); 129a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang QCameraStream *p_obj=(QCameraStream*) userdata; 130a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("DEBUG4:ExtMode:%d,streamid:%d",p_obj->mExtImgMode,bufs->bufs[0]->stream_id); 131a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang switch(p_obj->mExtImgMode) { 132a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case MM_CAMERA_PREVIEW: 133a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s : callback for MM_CAMERA_PREVIEW", __func__); 134a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ((QCameraStream_preview *)p_obj)->dataCallback(bufs); 135a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 136a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case MM_CAMERA_VIDEO: 137a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s : callback for MM_CAMERA_VIDEO", __func__); 138a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ((QCameraStream_preview *)p_obj)->dataCallback(bufs); 139a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 140a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case MM_CAMERA_SNAPSHOT_MAIN: 141a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0 142a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(p_obj->mHalCamCtrl->getHDRMode()) { 143a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Skipping Q Buf for HDR mode",__func__); 144a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 145a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 146a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif 147a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 148a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s : callback for MM_CAMERA_SNAPSHOT_MAIN", __func__); 149a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_obj->p_mm_ops->ops->qbuf(p_obj->mCameraHandle, 150a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_obj->mChannelId, 151a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang bufs->bufs[0]); 152a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 153a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case MM_CAMERA_SNAPSHOT_THUMBNAIL: 154a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 155a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang default: 156a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 157a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 158a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 159a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s X ", __func__); 160a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 161a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 162a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream *QCameraStream::mStreamTable[STREAM_TABLE_SIZE]; 163a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 164a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream::dataCallback(mm_camera_super_buf_t *bufs) 165a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 166a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mPendingCount!=0) { 167a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGD("Got frame request"); 168a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_mutex_lock(&mFrameDeliveredMutex); 169a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPendingCount--; 170a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGD("Completed frame request"); 171a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_cond_signal(&mFrameDeliveredCond); 172a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_mutex_unlock(&mFrameDeliveredMutex); 173a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang processPreviewFrame(bufs); 174a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } else { 175a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_mm_ops->ops->qbuf(mCameraHandle, 176a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mChannelId, bufs->bufs[0]); 177a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 178a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 179a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 180a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream::onNewRequest() 181a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 182a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s:E",__func__); 183a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_mutex_lock(&mFrameDeliveredMutex); 184a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("Sending Frame request"); 185a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPendingCount++; 186a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_cond_wait(&mFrameDeliveredCond,&mFrameDeliveredMutex); 187a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("Got frame"); 188a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_mutex_unlock(&mFrameDeliveredMutex); 189a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s:X",__func__); 190a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 191a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 192a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint32_t QCameraStream::streamOn() 193a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 194a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t rc=NO_ERROR; 195a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_stream_config_t stream_config; 196a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s:streamid:%d",__func__,mMmStreamId); 197a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock lock(mLock); 198a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mActive){ 199a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Stream:%d is already active", 200a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang __func__,mMmStreamId); 201a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return rc; 202a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 203a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 204a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mInit == true) { 205a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* this is the restart case */ 206a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang memset(&stream_config, 0, sizeof(mm_camera_stream_config_t)); 207a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.fmt=(cam_format_t)mFormat; 208a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.meta_header=MM_CAMEAR_META_DATA_TYPE_DEF; 209a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.width=mWidth; 210a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.height=mHeight; 211a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.rotation = 0; 212a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("<DEBUG>::%s: Width :%d Height:%d Format:%d",__func__,mWidth,mHeight,mFormat); 213a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.num_of_bufs=mNumBuffers; 214a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.need_stream_on=true; 215a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc=p_mm_ops->ops->config_stream(mCameraHandle, 216a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mChannelId, 217a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMmStreamId, 218a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &stream_config); 219a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: config_stream, rc = %d", __func__, rc); 220a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 221a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 222a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc = p_mm_ops->ops->start_streams(mCameraHandle, 223a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mChannelId, 224a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 1, 225a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &mMmStreamId); 226a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(rc==NO_ERROR) 227a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mActive = true; 228a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return rc; 229a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 230a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 231a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint32_t QCameraStream::streamOff(bool isAsyncCmd) 232a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 233a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t rc=NO_ERROR; 234a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock lock(mLock); 235a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(!mActive) { 236a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Stream:%d is not active", 237a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang __func__,mMmStreamId); 238a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return rc; 239a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 240a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 241a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc = p_mm_ops->ops->stop_streams(mCameraHandle, 242a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mChannelId, 243a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 1, 244a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &mMmStreamId); 245a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 246a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mActive=false; 247a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return rc; 248a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 249a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 250a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 251a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* initialize a streaming channel*/ 252a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream::initStream(mm_camera_img_mode imgmode, 253a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang cam_format_t format) 254a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 255a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int rc = MM_CAMERA_OK; 256a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t ret = NO_ERROR; 257a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_VIDEO; 258a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang cam_ctrl_dimension_t dim; 259a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int i; 260a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_stream_config_t stream_config; 261a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 262a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("QCameraStream::initStream : E"); 263a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 264a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mFormat = format; 265a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /*TODO: Convert between TEMPLATE to img_mode */ 266a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mExtImgMode = imgmode; 267a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /***********Allocate Stream**************/ 268a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 269a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc=p_mm_ops->ops->add_stream(mCameraHandle, 270a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mChannelId, 271a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_cb_routine, 272a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang (void *)this, 273a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mExtImgMode, 274a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 0/*sensor_idx*/); 275a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 276a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (rc < 0) 277a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang goto error1; 278a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 279a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMmStreamId=rc; 280a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: mMmStreamId = %d\n", __func__, mMmStreamId); 281a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 282a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang memset(&stream_config, 0, sizeof(mm_camera_stream_config_t)); 283a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.fmt=format; 284a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.meta_header=MM_CAMEAR_META_DATA_TYPE_DEF; 285a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.width=mWidth; 286a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.fmt.height=mHeight; 287a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("<DEBUG>::%s: Width :%d Height:%d Format:%d",__func__,mWidth,mHeight,format); 288a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.num_of_bufs=mNumBuffers; 289a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang stream_config.need_stream_on=true; 290a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc=p_mm_ops->ops->config_stream(mCameraHandle, 291a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mChannelId, 292a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMmStreamId, 293a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &stream_config); 294a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(MM_CAMERA_OK != rc) 295a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang goto error2; 296a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 297a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang goto end; 298a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 299a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 300a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangerror2: 301a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Error configuring stream",__func__); 302a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_mm_ops->ops->del_stream(mCameraHandle,mChannelId, 303a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMmStreamId); 304a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 305a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangerror1: 306a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 307a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangend: 308a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Setting mInit to true"); 309a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInit=true; 310a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 311a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 312a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 313a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 314a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream::deinitStream() 315a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 316a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 317a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int rc = MM_CAMERA_OK; 318a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 319a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s: E, Stream = %d\n", __func__, mMmStreamId); 320a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 321a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc= p_mm_ops->ops->del_stream(mCameraHandle,mChannelId, 322a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMmStreamId); 323a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 324a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s: X, Stream = %d\n", __func__, mMmStreamId); 325a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInit=false; 326a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 327a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 328a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 329a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream::setMode(int enable) { 330a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s :myMode %x ", __func__, myMode); 331a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (enable) { 332a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang myMode = (camera_mode_t)(myMode | CAMERA_ZSL_MODE); 333a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } else { 334a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang myMode = (camera_mode_t)(myMode & ~CAMERA_ZSL_MODE); 335a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 336a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 337a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 338a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 339a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream::setFormat() 340a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 341a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: E",__func__); 342a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 343a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang char mDeviceName[PROPERTY_VALUE_MAX]; 344a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang property_get("ro.product.device",mDeviceName," "); 345a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 346a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: X",__func__); 347a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 348a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 349a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 350a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream::QCameraStream (){ 351a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInit = false; 352a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mActive = false; 353a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* memset*/ 354a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang memset(&mCrop, 0, sizeof(mm_camera_rect_t)); 355a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 356a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 357a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream::QCameraStream(uint32_t CameraHandle, 358a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t ChannelId, 359a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t Width, 360a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t Height, 361a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_vtbl_t *mm_ops, 362a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang camera_mode_t mode) 363a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang :myMode(mode) 364a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 365a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInit = false; 366a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mActive = false; 367a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 368a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mCameraHandle=CameraHandle; 369a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mChannelId=ChannelId; 370a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mWidth=Width; 371a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mHeight=Height; 372a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p_mm_ops=mm_ops; 373a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 374a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* memset*/ 375a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang memset(&mCrop, 0, sizeof(mm_camera_rect_t)); 376a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 377a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPendingCount=0; 378a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_mutex_init(&mFrameDeliveredMutex, NULL); 379a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang pthread_cond_init(&mFrameDeliveredCond, NULL); 380a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 381a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 382a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream::~QCameraStream () {;} 383a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 384a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint QCameraStream::allocateStreamId() { 385a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int i = 0; 386a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (i = 0; i < STREAM_TABLE_SIZE; i++) 387a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mStreamTable[i] == NULL) { 388a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mStreamTable[i] = this; 389a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 390a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 391a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (i == STREAM_TABLE_SIZE) 392a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return INVALID_OPERATION; 393a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: mStreamTable[%d] = %p\n", __func__, i, mStreamTable[i]); 394a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return i; 395a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 396a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 397a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint QCameraStream::deallocateStreamId(int id) { 398a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (id < 0 || id >= STREAM_TABLE_SIZE) 399a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 400a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mStreamTable[id] = NULL; 401a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return OK; 402a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 403a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 404a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream *QCameraStream::getStreamAtId(int id) { 405a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (id < 0 || id >= STREAM_TABLE_SIZE) 406a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NULL; 407a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang else 408a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return mStreamTable[id]; 409a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 410a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 411a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream *QCameraStream::getStreamAtMmId(uint32_t mm_id) { 412a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /*TODO: More efficient to do direct lookup. But it requires 413a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *mm-camera-interface to expose a macro for handle-index mapping*/ 414a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int i = 0; i < STREAM_TABLE_SIZE; i++) { 415a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: %d: ", __func__, i); 416a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mStreamTable[i]) 417a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: mMmStreamId = %d", __func__, mStreamTable[i]->mMmStreamId); 418a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mStreamTable[i] && (mStreamTable[i]->mMmStreamId == mm_id)) 419a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return mStreamTable[i]; 420a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 421a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Cannot find stream with interface id %d", __func__, mm_id); 422a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NULL; 423a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 424a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 425a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream::streamOffAll() 426a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 427a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int i = 0; i < STREAM_TABLE_SIZE; i++) { 428a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mStreamTable[i]) { 429a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mStreamTable[i]->mActive) { 430a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s: stream off stream[%d]", __func__, i); 431a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mStreamTable[i]->streamOff(0); 432a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s: stream off stream[%d] done", __func__, i); 433a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 434a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mStreamTable[i]->mInit) { 435a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s: deinit stream[%d]", __func__, i); 436a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mStreamTable[i]->deinitStream(); 437a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s: deinit stream[%d] done", __func__, i); 438a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 439a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 440a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 441a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 442a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 443a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream::init() { 444a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 445a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 446a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 447a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream::start() { 448a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 449a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 450a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 451a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream::stop() { 452a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return; 453a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 454a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 455a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream::release() { 456a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return; 457a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 458a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 459a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream::setHALCameraControl(QCameraHardwareInterface* ctrl) { 460a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 461a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* provide a frame data user, 462a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for the queue monitor thread to call the busy queue is not empty*/ 463a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mHalCamCtrl = ctrl; 464a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 465a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 466a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}; // namespace android 467