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