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_TAG "QCameraHWI_Preview"
20a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/Log.h>
21a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/threads.h>
22a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <fcntl.h>
23a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <sys/mman.h>
24a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHAL.h"
25a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHWI.h"
26a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <genlock.h>
27a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <gralloc_priv.h>
28a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
29a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define UNLIKELY(exp) __builtin_expect(!!(exp), 0)
30a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
31a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* QCameraHWI_Preview class implementation goes here*/
32a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* following code implement the preview mode's image capture & display logic of this class*/
33a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
34a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangnamespace android {
35a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
36a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::setPreviewWindow(const camera2_stream_ops_t* window)
37a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
38a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    status_t retVal = NO_ERROR;
39a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE(" %s: E ", __FUNCTION__);
40a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if( window == NULL) {
41a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGW(" Setting NULL preview window ");
42a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        /* TODO: Current preview window will be invalidated.
43a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang         * Release all the buffers back */
44a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       // relinquishBuffers();
45a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
46a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    Mutex::Autolock lock(mLock);
47a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewWindow = window;
48a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV(" %s : X ", __FUNCTION__ );
49a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return retVal;
50a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
51a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
52a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint QCameraStream_preview::registerStreamBuffers(int num_buffers,
53a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        buffer_handle_t *buffers)
54a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
55a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int err;
56a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
57a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mNumBuffers = num_buffers;
58a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemory.buffer_count = num_buffers;
59a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    for (int i = 0; i < num_buffers; i++) {
60a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mPreviewMemory.buffer_handle[i] = buffers[i];
61a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mPreviewMemory.private_buffer_handle[i] = (struct private_handle_t *)buffers[i];
62a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGD("%s:Buffer Size:%d",__func__, mPreviewMemory.private_buffer_handle[i]->size);
63a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
64a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mDisplayBuf = new mm_camera_buf_def_t[num_buffers];
65a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (!mDisplayBuf) {
66a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("Unable to allocate mDisplayBuf");
67a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return NO_MEMORY;
68a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
69a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
70a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang   return OK;
71a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
72a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
73a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::initBuffers()
74a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
75a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    status_t ret = NO_ERROR;
76a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int width = mWidth;  /* width of channel  */
77a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int height = mHeight; /* height of channel */
78a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    uint32_t frame_len = mFrameOffsetInfo.frame_len; /* frame planner length */
79a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int buffer_num = mNumBuffers; /* number of buffers for display */
80a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    const char *pmem_region;
81a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    uint8_t num_planes = mFrameOffsetInfo.num_planes;
82a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    uint32_t planes[VIDEO_MAX_PLANES];
83a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    void *vaddr = NULL;
84a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    buffer_handle_t *buffer_handle;
85a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
86a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s:BEGIN",__func__);
87a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    memset(mNotifyBuffer, 0, sizeof(mNotifyBuffer));
88a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
89a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/
90a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    num_planes = mFrameOffsetInfo.num_planes;
91a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    for(int i=0; i < num_planes; i++)
92a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        planes[i] = mFrameOffsetInfo.mp[i].len;
93a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
94a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
95a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemoryLock.lock();
96a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    memset(mDisplayBuf, 0, sizeof(mm_camera_buf_def_t) * mNumBuffers);
97a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
98a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /*allocate memory for the buffers*/
99a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    for(int i = 0; i < mNumBuffers; i++){
100a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].num_planes = num_planes;
101a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].buf_idx = i;
102a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
103a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        /* Plane 0 needs to be set seperately. Set other planes
104a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang         * in a loop. */
105a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].planes[0].length = planes[0];
106a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].planes[0].m.userptr = mPreviewMemory.private_buffer_handle[i]->fd;
107a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].planes[0].data_offset = mFrameOffsetInfo.mp[0].offset;
108a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].planes[0].reserved[0] =0;
109a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        for (int j = 1; j < num_planes; j++) {
110a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mDisplayBuf[i].planes[j].length = planes[j];
111a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mDisplayBuf[i].planes[j].m.userptr = mPreviewMemory.private_buffer_handle[i]->fd;
112a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mDisplayBuf[i].planes[j].data_offset = mFrameOffsetInfo.mp[j].offset;
113a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mDisplayBuf[i].planes[j].reserved[0] =
114a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mDisplayBuf[i].planes[j-1].reserved[0] +
115a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mDisplayBuf[i].planes[j-1].length;
116a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
117a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
118a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        for (int j = 0; j < num_planes; j++)
119a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            ALOGE("Planes: %d length: %d userptr: %lu offset: %d\n", j,
120a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                     mDisplayBuf[i].planes[j].length,
121a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                     mDisplayBuf[i].planes[j].m.userptr,
122a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                     mDisplayBuf[i].planes[j].reserved[0]);
123a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
124a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].stream_id = mMmStreamId;
125a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].fd = mPreviewMemory.private_buffer_handle[i]->fd;
126a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("DEBUG2:Display buf[%d] fd:%d",i,mDisplayBuf[i].fd);
127a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf[i].frame_len = mFrameOffsetInfo.frame_len;
128a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }/*end of for loop*/
129a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
130a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* Dequeue N frames from native window and queue into interface. Only dequeue our requested buffers */
131a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    for (int i = 0; i < mNumBuffers; i++)
132a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mPreviewMemory.local_flag[i] = BUFFER_NOT_REGGED;
133a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    for (int i = 0; i < OPAQUE_BUFFER_COUNT; i++) {
134a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("mPreview Window %p",mPreviewWindow);
135a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        int err = mPreviewWindow->dequeue_buffer(mPreviewWindow, &buffer_handle);
136a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if (err == NO_ERROR && buffer_handle) {
137a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            int j;
138a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            for (j = 0; j < mPreviewMemory.buffer_count; j++) {
139a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                if (mPreviewMemory.buffer_handle[j] == *buffer_handle) {
140a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                    mPreviewMemory.local_flag[j] = BUFFER_OWNED;
141a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                    ALOGE("%s: [%d]: local_flag = 1", __func__, j);
142a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                    break;
143a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                }
144a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            }
145a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            if (j == mPreviewMemory.buffer_count) {
146a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                ALOGE("Cannot find matching handle in the table.");
147a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                return INVALID_OPERATION;
148a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            }
149a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        } else {
150a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            ALOGE("dequeue_buffer failed.");
151a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            return INVALID_OPERATION;
152a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
153a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
154a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
155a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* register the streaming buffers for the channel*/
156a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemoryLock.unlock();
157a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s:END",__func__);
158a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return NO_ERROR;
159a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
160a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangerror:
161a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemoryLock.unlock();
162a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
163a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: X", __func__);
164a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return ret;
165a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
166a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
167a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream_preview::deinitBuffers()
168a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
169a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemoryLock.lock();
170a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    for (int i = 0; i < mNumBuffers; i++) {
171a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if (mPreviewMemory.local_flag[i] == BUFFER_OWNED) {
172a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mPreviewWindow->cancel_buffer(mPreviewWindow,
173a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                &mPreviewMemory.buffer_handle[i]);
174a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mPreviewMemory.local_flag[i] = BUFFER_NOT_OWNED;
175a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
176a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
177a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemoryLock.unlock();
178a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
179a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
180a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream_preview::dumpFrameToFile(mm_camera_buf_def_t *newFrame)
181a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
182a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int32_t enabled = 0;
183a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int frm_num;
184a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  uint32_t  skip_mode;
185a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  char value[PROPERTY_VALUE_MAX];
186a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  char buf[32];
187a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int w, h;
188a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  static int count = 0;
189a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int file_fd;
190a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int rc = 0;
191a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int len;
192a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  unsigned long addr;
193a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  unsigned long * tmp = (unsigned long *)newFrame->buffer;
194a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  addr = *tmp;
195a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
196a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  len = newFrame->frame_len;
197a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  count++;
198a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  if(count < 100) {
199a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    snprintf(buf, sizeof(buf), "/data/mzhu%d.yuv", count);
200a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    file_fd = open(buf, O_RDWR | O_CREAT, 0777);
201a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
202a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    rc = write(file_fd, (const void *)addr, len);
203a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: file='%s', vaddr_old=0x%x, addr_map = 0x%p, len = %d, rc = %d",
204a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang          __func__, buf, (uint32_t)newFrame->buffer, (void *)addr, len, rc);
205a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    close(file_fd);
206a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: dump %s, rc = %d, len = %d", __func__, buf, rc, len);
207a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  }
208a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
209a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
210a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint QCameraStream_preview::prepareStream()
211a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
212a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mm_camera_img_mode img_mode;
213a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    cam_format_t format;
214a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    struct private_handle_t *private_handle = mPreviewMemory.private_buffer_handle[0];
215a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
216a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: private_handle->format = %d, flags = %d", __func__,
217a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        private_handle->format, private_handle->flags);
218a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (private_handle->flags & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER)
219a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        img_mode = MM_CAMERA_VIDEO;
220a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    else if (private_handle->flags & private_handle_t::PRIV_FLAGS_CAMERA_WRITE)
221a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        img_mode = MM_CAMERA_PREVIEW;
222a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    else {
223a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s: Invalid flags %d\n", __func__, private_handle->flags);
224a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return BAD_VALUE;
225a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
226a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
227a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    switch (private_handle->format) {
228a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
229a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        format = CAMERA_YUV_420_NV12;
230a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        break;
231a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
232a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        format = CAMERA_YUV_420_NV21;
233a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        break;
234a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    default:
235a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s: Invalid format!!!", __func__);
236a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return BAD_VALUE;
237a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
238a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(NO_ERROR!=initStream(img_mode, format)) {
239a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("Init stream failed");
240a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return BAD_VALUE;
241a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
242a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return OK;
243a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
244a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
245a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::processPreviewFrame (
246a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  mm_camera_super_buf_t *frame)
247a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
248a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s",__func__);
249a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int err = 0;
250a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int msgType = 0;
251a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int i;
252a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    camera_frame_metadata_t *metadata = NULL;
253a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
254a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    Mutex::Autolock lock(mLock);
255a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(!mActive) {
256a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("Preview Stopped. Returning callback");
257a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return NO_ERROR;
258a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
259a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
260a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(mHalCamCtrl==NULL) {
261a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s: X: HAL control object not set",__func__);
262a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       /*Call buf done*/
263a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       return BAD_VALUE;
264a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
265a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    nsecs_t timeStamp = seconds_to_nanoseconds(frame->bufs[0]->ts.tv_sec) ;
266a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    timeStamp += frame->bufs[0]->ts.tv_nsec;
267a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
268a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(mFirstFrameRcvd == false) {
269a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        //mm_camera_util_profile("HAL: First preview frame received");
270a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mFirstFrameRcvd = true;
271a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
272a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
273a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    //  dumpFrameToFile(frame->bufs[0]);
274a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
275a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemoryLock.lock();
276a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mNotifyBuffer[frame->bufs[0]->buf_idx] = *frame;
277a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("processPreviewFrame: timeStamp = %lld", (int64_t)timeStamp);
278a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    err = mPreviewWindow->enqueue_buffer(mPreviewWindow, (int64_t)timeStamp,
279a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                  &mPreviewMemory.buffer_handle[frame->bufs[0]->buf_idx]);
280a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(err != 0) {
281a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err);
282a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
283a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemory.local_flag[frame->bufs[0]->buf_idx] = BUFFER_NOT_OWNED;
284a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
285a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    buffer_handle_t *buffer_handle = NULL;
286a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    err = mPreviewWindow->dequeue_buffer(mPreviewWindow, &buffer_handle);
287a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (err == NO_ERROR && buffer_handle != NULL) {
288a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        int rc = MM_CAMERA_OK;
289a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGD("%s: dequed buf hdl =%p", __func__, *buffer_handle);
290a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        for(i = 0; i < mPreviewMemory.buffer_count; i++) {
291a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            if(mPreviewMemory.buffer_handle[i] == *buffer_handle) {
292a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                ALOGE("<DEBUG2>:Found buffer in idx:%d",i);
293a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                break;
294a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            }
295a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
296a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if (mPreviewMemory.local_flag[i] == BUFFER_NOT_REGGED) {
297a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mm_camera_buf_def_t buf = mDisplayBuf[i];
298a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mPreviewMemory.local_flag[i] = BUFFER_OWNED;
299a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            rc = p_mm_ops->ops->qbuf(mCameraHandle, mChannelId, &buf);
300a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        } else {
301a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            mPreviewMemory.local_flag[i] = BUFFER_OWNED;
302a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            rc = p_mm_ops->ops->qbuf(mCameraHandle, mChannelId, mNotifyBuffer[i].bufs[0]);
303a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
304a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
305a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if(rc != MM_CAMERA_OK) {
306a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            /* how to handle the error of qbuf? */
307a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            ALOGE("BUF DONE FAILED");
308a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
309a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
310a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* Save the last displayed frame. We'll be using it to fill the gap between
311a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       when preview stops and postview start during snapshot.*/
312a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mLastQueuedFrame = &(mDisplayBuf[frame->bufs[0]->buf_idx]);
313a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mPreviewMemoryLock.unlock();
314a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
315a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return NO_ERROR;
316a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
317a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
318a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
319a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview
320a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
321a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
322a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream_preview::QCameraStream_preview(uint32_t CameraHandle,
323a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        uint32_t ChannelId,
324a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        uint32_t Width,
325a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        uint32_t Height,
326a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        int requestedFormat,
327a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        mm_camera_vtbl_t *mm_ops,
328a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        camera_mode_t mode) :
329a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                 QCameraStream(CameraHandle,
330a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        ChannelId,
331a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        Width,
332a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        Height,
333a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        mm_ops,
334a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        mode),
335a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                 mLastQueuedFrame(NULL),
336a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                 mDisplayBuf(NULL),
337a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                 mNumFDRcvd(0)
338a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
339a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mHalCamCtrl = NULL;
340a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: E", __func__);
341a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
342a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mStreamId = allocateStreamId();
343a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
344a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    switch (requestedFormat) {
345a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    case CAMERA2_HAL_PIXEL_FORMAT_OPAQUE:
346a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mMaxBuffers = 5;
347a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        break;
348a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    case HAL_PIXEL_FORMAT_BLOB:
349a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mMaxBuffers = 1;
350a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        break;
351a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    default:
352a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("Unsupported requested format %d", requestedFormat);
353a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mMaxBuffers = 1;
354a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        break;
355a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
356a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /*TODO: There has to be a better way to do this*/
357a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: X", __func__);
358a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
359a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
360a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview
361a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
362a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
363a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream_preview::~QCameraStream_preview() {
364a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: E", __func__);
365a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	if(mActive) {
366a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang		streamOff(0);
367a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	}
368a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	if(mInit) {
369a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang		deinitStream();
370a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	}
371a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	mInit = false;
372a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	mActive = false;
373a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (mDisplayBuf) {
374a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        delete[] mDisplayBuf;
375a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mDisplayBuf = NULL;
376a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
377a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    deallocateStreamId(mStreamId);
378a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: X", __func__);
379a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
380a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
381a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
382a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview
383a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
384a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
385a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::init()
386a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
387a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    status_t ret = NO_ERROR;
388a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: E", __func__);
389a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
390a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0
391a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (!(myMode & CAMERA_ZSL_MODE)) {
392a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("Setting OP MODE to MM_CAMERA_OP_MODE_VIDEO");
393a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_VIDEO;
394a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ret = p_mm_ops->ops->set_parm (mCameraHandle, MM_CAMERA_PARM_OP_MODE,
395a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                                        &op_mode);
396a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("OP Mode Set");
397a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
398a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if(MM_CAMERA_OK != ret) {
399a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_VIDEO err=%d\n", __func__, ret);
400a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang          return BAD_VALUE;
401a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
402a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }else {
403a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("Setting OP MODE to MM_CAMERA_OP_MODE_ZSL");
404a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_ZSL;
405a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ret =p_mm_ops->ops->set_parm (mCameraHandle, MM_CAMERA_PARM_OP_MODE,
406a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                                        &op_mode);
407a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if(MM_CAMERA_OK != ret) {
408a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_ZSL err=%d\n", __func__, ret);
409a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang          return BAD_VALUE;
410a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
411a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang     }
412a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
413a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    setFormat();
414a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = QCameraStream::initStream();
415a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (NO_ERROR!=ret) {
416a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGE("%s E: can't init native cammera preview ch\n",__func__);
417a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        return ret;
418a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
419a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
420a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  mInit = true;
421a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif
422a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  return ret;
423a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
424a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
425a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview
426a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
427a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
428a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::start()
429a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
430a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: E", __func__);
431a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    status_t ret = NO_ERROR;
432a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
433a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    Mutex::Autolock lock(mLock);
434a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
435a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* call start() in parent class to start the monitor thread*/
436a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    //QCameraStream::start ();
437a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
438a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0
439a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = cam_config_prepare_buf(mCameraId, &mDisplayBuf);
440a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Debug : %s : cam_config_prepare_buf",__func__);
441a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(ret != MM_CAMERA_OK) {
442a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ALOGV("%s:reg preview buf err=%d\n", __func__, ret);
443a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ret = BAD_VALUE;
444a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        goto error;
445a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }else {
446a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        ret = NO_ERROR;
447a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
448a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif
449a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* For preview, the OP_MODE we set is dependent upon whether we are
450a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       starting camera or camcorder. For snapshot, anyway we disable preview.
451a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       However, for ZSL we need to set OP_MODE to OP_MODE_ZSL and not
452a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       OP_MODE_VIDEO. We'll set that for now in CamCtrl. So in case of
453a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang       ZSL we skip setting Mode here */
454a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
455a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
456a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* call mm_camera action start(...)  */
457a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Starting Preview/Video Stream. ");
458a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mFirstFrameRcvd = false;
459a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
460a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Starting Preview/Video Stream. ");
461a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = streamOn();
462a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if (MM_CAMERA_OK != ret) {
463a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      ALOGE ("%s: preview streaming start err=%d\n", __func__, ret);
464a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      ret = BAD_VALUE;
465a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      goto end;
466a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
467a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
468a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Debug : %s : Preview streaming Started",__func__);
469a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = NO_ERROR;
470a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
471a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mActive =  true;
472a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    goto end;
473a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
474a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangend:
475a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: X", __func__);
476a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return ret;
477a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  }
478a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
479a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
480a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
481a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview
482a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
483a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  void QCameraStream_preview::stop() {
484a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: E", __func__);
485a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int ret=MM_CAMERA_OK;
486a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
487a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(!mActive) {
488a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      return;
489a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
490a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    Mutex::Autolock lock(mLock);
491a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mActive =  false;
492a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* unregister the notify fn from the mmmm_camera_t object*/
493a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
494a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGI("%s: Stop the thread \n", __func__);
495a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* call stop() in parent class to stop the monitor thread*/
496a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    //stream_info = mHalCamCtrl->getChannelInterface();
497a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
498a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = streamOff(0);
499a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(MM_CAMERA_OK != ret) {
500a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      ALOGE ("%s: camera preview stop err=%d\n", __func__, ret);
501a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
502a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0
503a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_PREVIEW);
504a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(ret != MM_CAMERA_OK) {
505a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      ALOGE("%s:Unreg preview buf err=%d\n", __func__, ret);
506a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      //ret = BAD_VALUE;
507a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
508a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif
509a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* In case of a clean stop, we need to clean all buffers*/
510a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Debug : %s : Buffer Unprepared",__func__);
511a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /*free camera_memory handles and return buffer back to surface*/
512a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ret= QCameraStream::deinitStream();
513a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE(": %s : De init Channel",__func__);
514a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(ret != MM_CAMERA_OK) {
515a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      ALOGE("%s:Deinit preview channel failed=%d\n", __func__, ret);
516a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      //ret = BAD_VALUE;
517a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
518a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: X", __func__);
519a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
520a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  }
521a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
522a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview
523a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
524a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  void QCameraStream_preview::release() {
525a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
526a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s : BEGIN",__func__);
527a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int ret=MM_CAMERA_OK,i;
528a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
529a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(!mInit)
530a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    {
531a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      ALOGE("%s : Stream not Initalized",__func__);
532a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      return;
533a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
534a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
535a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(mActive) {
536a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      this->streamOff(0);
537a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
538a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
539a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
540a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(mInit) {
541a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        deinitStream();
542a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
543a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    mInit = false;
544a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s: END", __func__);
545a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
546a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  }
547a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
548a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream*
549a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream_preview::createInstance(uint32_t CameraHandle,
550a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        uint32_t ChannelId,
551a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        uint32_t Width,
552a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        uint32_t Height,
553a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        int requestedFormat,
554a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        mm_camera_vtbl_t *mm_ops,
555a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        camera_mode_t mode)
556a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
557a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  QCameraStream* pme = new QCameraStream_preview(CameraHandle,
558a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        ChannelId,
559a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        Width,
560a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        Height,
561a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        requestedFormat,
562a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        mm_ops,
563a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                        mode);
564a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  return pme;
565a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
566a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
567a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview
568a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
569a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
570a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream_preview::deleteInstance(QCameraStream *p)
571a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
572a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  if (p){
573a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: BEGIN", __func__);
574a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    p->release();
575a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    delete p;
576a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    p = NULL;
577a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("%s: END", __func__);
578a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  }
579a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
580a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
581a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
582a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* Temp helper function */
583a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid *QCameraStream_preview::getLastQueuedFrame(void)
584a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
585a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return mLastQueuedFrame;
586a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
587a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
588a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
589a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// No code beyone this line
590a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// ---------------------------------------------------------------------------
591a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}; // namespace android
592