1e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*
2e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved.
3e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**
4e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** Licensed under the Apache License, Version 2.0 (the "License");
5e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** you may not use this file except in compliance with the License.
6e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** You may obtain a copy of the License at
7e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**
8e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**     http://www.apache.org/licenses/LICENSE-2.0
9e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**
10e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** Unless required by applicable law or agreed to in writing, software
11e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** distributed under the License is distributed on an "AS IS" BASIS,
12e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** See the License for the specific language governing permissions and
14e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** limitations under the License.
15e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev*/
16e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
17e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*#error uncomment this for compiler test!*/
18e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
19e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define LOG_NDEBUG 0
20e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define LOG_NDDEBUG 0
21e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define LOG_NIDEBUG 0
22e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define LOG_TAG "QCameraHWI_Still"
23e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <utils/Log.h>
24e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <utils/threads.h>
25e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <fcntl.h>
26e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <sys/mman.h>
27e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <media/mediarecorder.h>
28e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <math.h>
29e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include "QCameraHAL.h"
30e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include "QCameraHWI.h"
31e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
32e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define THUMBNAIL_DEFAULT_WIDTH 512
33e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define THUMBNAIL_DEFAULT_HEIGHT 384
34e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
35e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* following code implement the still image capture & encoding logic of this class*/
36e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevnamespace android {
37e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
38e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevtypedef enum {
39e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_ERROR,
40e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_UNINIT,
41e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_CH_ACQUIRED,
42e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_BUF_NOTIF_REGD,
43e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_BUF_INITIALIZED,
44e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_INITIALIZED,
45e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_IMAGE_CAPTURE_STRTD,
46e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_YUV_RECVD,
47e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_JPEG_ENCODING,
48e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_JPEG_ENCODE_DONE,
49e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_JPEG_COMPLETE_ENCODE_DONE,
50e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
51e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*Add any new state above*/
52e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    SNAPSHOT_STATE_MAX
53e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} snapshot_state_type_t;
54e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
55e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
56e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//-----------------------------------------------------------------------
57e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// Constants
58e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//----------------------------------------------------------------------
59e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic const int PICTURE_FORMAT_JPEG = 1;
60e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic const int PICTURE_FORMAT_RAW = 2;
61e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic const int POSTVIEW_SMALL_HEIGHT = 144;
62e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
63e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
64e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* static functions*/
65e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
66e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
67e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
68e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
69e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* TBD: Temp: to be removed*/
70e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic pthread_mutex_t g_s_mutex;
71e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int g_status = 0;
72e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic pthread_cond_t g_s_cond_v;
73e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
74e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic void mm_app_snapshot_done()
75e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
76e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  pthread_mutex_lock(&g_s_mutex);
77e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  g_status = TRUE;
78e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  pthread_cond_signal(&g_s_cond_v);
79e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  pthread_mutex_unlock(&g_s_mutex);
80e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
81e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
82e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic void mm_app_snapshot_wait()
83e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
84e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        pthread_mutex_lock(&g_s_mutex);
85e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(FALSE == g_status) pthread_cond_wait(&g_s_cond_v, &g_s_mutex);
86e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        pthread_mutex_unlock(&g_s_mutex);
87e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    g_status = FALSE;
88e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
89e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
90e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int mm_app_dump_snapshot_frame(char *filename,
91e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      const void *buffer,
92e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      uint32_t len)
93e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
94e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    char bufp[128];
95e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int file_fdp;
96e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int rc = 0;
97e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
98e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    file_fdp = open(filename, O_RDWR | O_CREAT, 0777);
99e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
100e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (file_fdp < 0) {
101e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        rc = -1;
102e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
103e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
104e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    write(file_fdp,
105e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (const void *)buffer, len);
106e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    close(file_fdp);
107e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
108e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return rc;
109e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
110e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
111e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* Callback received when a frame is available after snapshot*/
112e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic void snapshot_notify_cb(mm_camera_ch_data_buf_t *recvd_frame,
113e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                               void *user_data)
114e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
115e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    QCameraStream_Snapshot *pme = (QCameraStream_Snapshot *)user_data;
116e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
117e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
118e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
119e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (pme != NULL) {
120e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        pme->receiveRawPicture(recvd_frame);
121e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
122e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else{
123e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGW("%s: Snapshot obj NULL in callback", __func__);
124e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
125e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
126e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
127e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
128e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
129e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
130e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* Once we give frame for encoding, we get encoded jpeg image
131e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev   fragments by fragment. We'll need to store them in a buffer
132e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev   to form complete JPEG image */
133e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic void snapshot_jpeg_fragment_cb(uint8_t *ptr,
134e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      uint32_t size,
135e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      void *user_data)
136e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
137e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    QCameraStream_Snapshot *pme = (QCameraStream_Snapshot *)user_data;
138e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
139e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: E",__func__);
140e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (pme != NULL) {
141e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        pme->receiveJpegFragment(ptr,size);
142e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
143e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else
144e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGW("%s: Receive jpeg fragment cb obj Null", __func__);
145e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
146e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X",__func__);
147e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
148e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
149e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* This callback is received once the complete JPEG encoding is done */
150e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic void snapshot_jpeg_cb(jpeg_event_t event, void *user_data)
151e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
152e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    QCameraStream_Snapshot *pme = (QCameraStream_Snapshot *)user_data;
153e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: E ",__func__);
154e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
155e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (event != JPEG_EVENT_DONE) {
156e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (event == JPEG_EVENT_THUMBNAIL_DROPPED) {
157e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Error in thumbnail encoding (event: %d)!!!",
158e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 __func__, event);
159e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGD("%s: X",__func__);
160e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            return;
161e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
162e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        else {
163e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Error (event: %d) while jpeg encoding!!!",
164e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 __func__, event);
165e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
166e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
167e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
168e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (pme != NULL) {
169e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       pme->receiveCompleteJpegPicture(event);
170e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       LOGE(" Completed issuing JPEG callback");
171e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       /* deinit only if we are done taking requested number of snapshots */
172e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       if (pme->getSnapshotState() == SNAPSHOT_STATE_JPEG_COMPLETE_ENCODE_DONE) {
173e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           LOGE(" About to issue deinit callback");
174e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       /* If it's ZSL Mode, we don't deinit now. We'll stop the polling thread and
175e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          deinit the channel/buffers only when we change the mode from zsl to
176e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          non-zsl. */
177e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           if (!(pme->isZSLMode())) {
178e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               pme->stop();
179e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           }
180e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
181e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
182e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else
183e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGW("%s: Receive jpeg cb Obj Null", __func__);
184e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
185e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
186e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X",__func__);
187e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
188e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
189e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
190e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
191e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* private functions*/
192e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
193e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
194e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::
195e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevreceiveJpegFragment(uint8_t *ptr, uint32_t size)
196e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
197e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: E", __func__);
198e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#if 0
199e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mJpegHeap != NULL) {
200e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Copy jpeg...", __func__);
201e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memcpy((uint8_t *)mJpegHeap->mHeap->base()+ mJpegOffset, ptr, size);
202e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mJpegOffset += size;
203e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
204e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else {
205e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: mJpegHeap is NULL!", __func__);
206e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
207e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    #else
208e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mHalCamCtrl->mJpegMemory.camera_memory[0] != NULL && ptr != NULL && size > 0) {
209e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memcpy((uint8_t *)((uint32_t)mHalCamCtrl->mJpegMemory.camera_memory[0]->data + mJpegOffset), ptr, size);
210e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mJpegOffset += size;
211e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
212e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
213e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*
214e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                memcpy((uint8_t *)((uint32_t)mHalCamCtrl->mJpegMemory.camera_memory[0]->data + mJpegOffset), ptr, size);
215e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mJpegOffset += size;
216e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        */
217e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
218e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: mJpegHeap is NULL!", __func__);
219e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
220e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
221e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
222e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    #endif
223e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
224e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
225e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
226e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
227e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
228e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::
229e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevreceiveCompleteJpegPicture(jpeg_event_t event)
230e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
231e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int msg_type = CAMERA_MSG_COMPRESSED_IMAGE;
232e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: E", __func__);
233e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_memory_t *encodedMem = NULL;
234e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_data_callback jpg_data_cb = NULL;
235e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    bool fail_cb_flag = false;
236e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
237e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //Mutex::Autolock l(&snapshotLock);
238e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mStopCallbackLock.lock( );
239e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mActive && !isLiveSnapshot()) {
240e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s : Cancel Picture",__func__);
241e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        fail_cb_flag = true;
242e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
243e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
244e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
245e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mCurrentFrameEncoded!=NULL /*&& !isLiveSnapshot()*/){
246e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGV("<DEBUG>: Calling buf done for snapshot buffer");
247e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        cam_evt_buf_done(mCameraId, mCurrentFrameEncoded);
248e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
249e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->dumpFrameToFile(mHalCamCtrl->mJpegMemory.camera_memory[0]->data, mJpegOffset, (char *)"debug", (char *)"jpg", 0);
250e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
251e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
252e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    msg_type = CAMERA_MSG_COMPRESSED_IMAGE;
253e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mHalCamCtrl->mDataCb && (mHalCamCtrl->mMsgEnabled & msg_type)) {
254e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        jpg_data_cb = mHalCamCtrl->mDataCb;
255e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else{
256e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: JPEG callback was cancelled--not delivering image.", __func__);
257e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
258e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    setSnapshotState(SNAPSHOT_STATE_JPEG_ENCODE_DONE);
259e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mNumOfRecievedJPEG++;
260e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->deinitExifData();
261e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
262e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* free the resource we allocated to maintain the structure */
263e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //mm_camera_do_munmap(main_fd, (void *)main_buffer_addr, mSnapshotStreamBuf.frame_len);
264e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mCurrentFrameEncoded) {
265e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        free(mCurrentFrameEncoded);
266e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mCurrentFrameEncoded = NULL;
267e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
268e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
269e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Before leaving check the jpeg queue. If it's not empty give the available
270e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       frame for encoding*/
271e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!mSnapshotQueue.isEmpty()) {
272e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGI("%s: JPEG Queue not empty. Dequeue and encode.", __func__);
273e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mm_camera_ch_data_buf_t* buf =
274e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            (mm_camera_ch_data_buf_t *)mSnapshotQueue.dequeue();
275e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        //encodeDisplayAndSave(buf, 1);
276e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if ( NO_ERROR != encodeDisplayAndSave(buf, 1)){
277e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          fail_cb_flag = true;
278e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
279e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }  else if (mNumOfSnapshot == mNumOfRecievedJPEG )  { /* finished */
280e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGD("%s: Before omxJpegFinish", __func__);
281e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      omxJpegFinish();
282e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGD("%s: After omxJpegFinish", __func__);
283e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* getRemainingSnapshots call will give us number of snapshots still
284e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           remaining after flushing current zsl buffer once*/
285e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGD("%s: Complete JPEG Encoding Done!", __func__);
286e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      setSnapshotState(SNAPSHOT_STATE_JPEG_COMPLETE_ENCODE_DONE);
287e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mBurstModeFlag = false;
288e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mSnapshotQueue.flush();
289e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mNumOfRecievedJPEG = 0;
290e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      /* in case of zsl, we need to reset some of the zsl attributes */
291e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if (isZSLMode()){
292e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGD("%s: Resetting the ZSL attributes", __func__);
293e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          setZSLChannelAttribute();
294e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
295e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if (!isZSLMode() && !isLiveSnapshot()){
296e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         //Stop polling before calling datacb for if not ZSL mode
297e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         stopPolling();
298e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
299e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
300e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
301e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: mNumOfRecievedJPEG(%d), mNumOfSnapshot(%d)", __func__, mNumOfRecievedJPEG, mNumOfSnapshot);
302e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
303e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(fail_cb_flag && mHalCamCtrl->mDataCb &&
304e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE)) {
305e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* get picture failed. Give jpeg callback with NULL data
306e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         * to the application to restore to preview mode
307e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         */
308e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        jpg_data_cb  = mHalCamCtrl->mDataCb;
309e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
310e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!fail_cb_flag) {
311e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        camera_memory_t *encodedMem = mHalCamCtrl->mGetMemory(
312e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mJpegMemory.fd[0], mJpegOffset, 1, mHalCamCtrl);
313e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (!encodedMem || !encodedMem->data) {
314e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: mGetMemory failed.\n", __func__);
315e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
316e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memcpy(encodedMem->data, mHalCamCtrl->mJpegMemory.camera_memory[0]->data, mJpegOffset );
317e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mStopCallbackLock.unlock( );
318e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if ((mActive || isLiveSnapshot()) && jpg_data_cb != NULL) {
319e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGV("%s: Calling upperlayer callback to store JPEG image", __func__);
320e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            jpg_data_cb (msg_type,encodedMem, 0, NULL,mHalCamCtrl->mCallbackCookie);
321e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
322e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encodedMem->release( encodedMem );
323e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        jpg_data_cb = NULL;
324e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else{
325e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGV("Image Encoding Failed... Notify Upper layer");
326e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mStopCallbackLock.unlock( );
327e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if((mActive || isLiveSnapshot()) && jpg_data_cb != NULL) {
328e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            jpg_data_cb (CAMERA_MSG_COMPRESSED_IMAGE,NULL, 0, NULL,
329e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                         mHalCamCtrl->mCallbackCookie);
330e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
331e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
332e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //reset jpeg_offset
333e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mJpegOffset = 0;
334e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
335e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
336e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
337e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
338e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevconfigSnapshotDimension(cam_ctrl_dimension_t* dim)
339e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
340e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    bool matching = true;
341e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_format_t img_format;
342e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
343e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
344e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
345e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s:Passed picture size: %d X %d", __func__,
346e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->picture_width, dim->picture_height);
347e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s:Passed postview size: %d X %d", __func__,
348e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->ui_thumbnail_width, dim->ui_thumbnail_height);
349e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
350e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* First check if the picture resolution is the same, if not, change it*/
351e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->getPictureSize(&mPictureWidth, &mPictureHeight);
352e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Picture size received: %d x %d", __func__,
353e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mPictureWidth, mPictureHeight);
354e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*Current VFE software design requires picture size >= display size for ZSL*/
355e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (isZSLMode()){
356e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mPostviewWidth = dim->display_width;
357e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mPostviewHeight = dim->display_height;
358e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
359e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mPostviewWidth = mHalCamCtrl->mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
360e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mPostviewHeight =  mHalCamCtrl->mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
361e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
362e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*If application requested thumbnail size to be (0,0)
363e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       then configure second outout to a default size.
364e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       Jpeg encoder will drop thumbnail as reflected in encodeParams.
365e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    */
366e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDropThumbnail = false;
367e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mPostviewWidth == 0 && mPostviewHeight == 0) {
368e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mPostviewWidth = THUMBNAIL_DEFAULT_WIDTH;
369e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mPostviewHeight = THUMBNAIL_DEFAULT_HEIGHT;
370e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mDropThumbnail = true;
371e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
372e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
373e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Postview size received: %d x %d", __func__,
374e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mPostviewWidth, mPostviewHeight);
375e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
376e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    matching = (mPictureWidth == dim->picture_width) &&
377e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (mPictureHeight == dim->picture_height);
378e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    matching &= (dim->ui_thumbnail_width == mPostviewWidth) &&
379e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (dim->ui_thumbnail_height == mPostviewHeight);
380e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
381e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* picture size currently set do not match with the one wanted
382e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       by user.*/
383e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!matching) {
384e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (mPictureWidth < mPostviewWidth || mPictureHeight < mPostviewHeight) {
385e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            //Changes to Handle VFE limitation.
386e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mActualPictureWidth = mPictureWidth;
387e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mActualPictureHeight = mPictureHeight;
388e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mPictureWidth = mPostviewWidth;
389e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mPictureHeight = mPostviewHeight;
390e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mJpegDownscaling = TRUE;
391e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }else{
392e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mJpegDownscaling = FALSE;
393e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
394e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim->picture_width  = mPictureWidth;
395e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim->picture_height = mPictureHeight;
396e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim->ui_thumbnail_height = mThumbnailHeight = mPostviewHeight;
397e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim->ui_thumbnail_width = mThumbnailWidth = mPostviewWidth;
398e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
399e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    #if 0
400e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    img_format = mHalCamCtrl->getPreviewFormat();
401e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (img_format) {
402e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        matching &= (img_format == dim->main_img_format);
403e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (!matching) {
404e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            dim->main_img_format = img_format;
405e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            dim->thumb_format = img_format;
406e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
407e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
408e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    #endif
409e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!matching) {
410e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         LOGD("%s: Image Sizes before set parm call: main: %dx%d thumbnail: %dx%d",
411e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              __func__,
412e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              dim->picture_width, dim->picture_height,
413e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              dim->ui_thumbnail_width, dim->ui_thumbnail_height);
414e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
415e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_config_set_parm(mCameraId, MM_CAMERA_PARM_DIMENSION,dim);
416e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (NO_ERROR != ret) {
417e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: error - can't config snapshot parms!", __func__);
418e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = FAILED_TRANSACTION;
419e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
420e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
421e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
422e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* set_parm will return corrected dimension based on aspect ratio and
423e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       ceiling size */
424e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureWidth = dim->picture_width;
425e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureHeight = dim->picture_height;
426e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPostviewHeight = mThumbnailHeight = dim->ui_thumbnail_height;
427e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPostviewWidth = mThumbnailWidth = dim->ui_thumbnail_width;
428e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureFormat= dim->main_img_format;
429e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailFormat = dim->thumb_format;
430e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
431e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Image Format: %d", __func__, dim->main_img_format);
432e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s: Image Sizes: main: %dx%d thumbnail: %dx%d", __func__,
433e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->picture_width, dim->picture_height,
434e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->ui_thumbnail_width, dim->ui_thumbnail_height);
435e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
436e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
437e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
438e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
439e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
440e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
441e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevinitRawSnapshotChannel(cam_ctrl_dimension_t *dim,
442e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                       int num_of_snapshots)
443e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
444e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
445e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_ch_image_fmt_parm_t fmt;
446e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_channel_attr_t ch_attr;
447e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
448e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_raw_streaming_type_t raw_stream_type =
449e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        MM_CAMERA_RAW_STREAMING_CAPTURE_SINGLE;
450e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
451e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
452e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
453e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Initialize stream - set format, acquire channel */
454e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*TBD: Currently we only support single raw capture*/
455e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("num_of_snapshots = %d",num_of_snapshots);
456e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (num_of_snapshots == 1) {
457e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        raw_stream_type = MM_CAMERA_RAW_STREAMING_CAPTURE_SINGLE;
458e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
459e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
460e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Set channel attribute */
461e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Set Raw Snapshot Channel attribute", __func__);
462e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&ch_attr, 0, sizeof(ch_attr));
463e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ch_attr.type = MM_CAMERA_CH_ATTR_RAW_STREAMING_TYPE;
464e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ch_attr.raw_streaming_mode = raw_stream_type;
465e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
466e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( NO_ERROR !=
467e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        cam_ops_ch_set_attr(mCameraId, MM_CAMERA_CH_RAW, &ch_attr)) {
468e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Failure setting Raw channel attribute.", __func__);
469e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
470e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
471e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
472e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
473e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&fmt, 0, sizeof(mm_camera_ch_image_fmt_parm_t));
474e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.ch_type = MM_CAMERA_CH_RAW;
475e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.def.fmt = CAMERA_BAYER_SBGGR10;
476e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.def.dim.width = dim->raw_picture_width;
477e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.def.dim.height = dim->raw_picture_height;
478e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
479e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
480e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: Raw snapshot channel fmt: %d", __func__,
481e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         fmt.def.fmt);
482e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: Raw snapshot resolution: %dX%d", __func__,
483e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->raw_picture_width, dim->raw_picture_height);
484e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
485e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Set Raw Snapshot channel image format", __func__);
486e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_set_parm(mCameraId, MM_CAMERA_PARM_CH_IMAGE_FMT, &fmt);
487e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
488e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Set Raw Snapshot Channel format err=%d\n", __func__, ret);
489e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
490e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
491e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
492e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
493e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
494e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
495e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
496e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
497e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: X", __func__);
498e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
499e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
500e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
501e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
502e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
503e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevsetZSLChannelAttribute(void)
504e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
505e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
506e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_channel_attr_t ch_attr;
507e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
508e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
509e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&ch_attr, 0, sizeof(mm_camera_channel_attr_t));
510e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ch_attr.type = MM_CAMERA_CH_ATTR_BUFFERING_FRAME;
511e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ch_attr.buffering_frame.look_back = mHalCamCtrl->getZSLBackLookCount();
512e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ch_attr.buffering_frame.water_mark = mHalCamCtrl->getZSLQueueDepth();
513e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ch_attr.buffering_frame.interval = mHalCamCtrl->getZSLBurstInterval( );
514e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: ZSL queue_depth = %d, back_look_count = %d", __func__,
515e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         ch_attr.buffering_frame.water_mark,
516e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         ch_attr.buffering_frame.look_back);
517e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( NO_ERROR !=
518e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        cam_ops_ch_set_attr(mCameraId, MM_CAMERA_CH_SNAPSHOT, &ch_attr)) {
519e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Failure setting ZSL channel attribute.", __func__);
520e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
521e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
522e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
523e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
524e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
525e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
526e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
527e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
528e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
529e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevinitSnapshotFormat(cam_ctrl_dimension_t *dim)
530e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
531e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
532e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_ch_image_fmt_parm_t fmt;
533e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
534e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
535e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
536e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* For ZSL mode we'll need to set channel attribute */
537e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (isZSLMode()) {
538e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = setZSLChannelAttribute();
539e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (ret != NO_ERROR) {
540e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
541e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
542e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
543e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
544e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&fmt, 0, sizeof(mm_camera_ch_image_fmt_parm_t));
545e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.ch_type = MM_CAMERA_CH_SNAPSHOT;
546e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.snapshot.main.fmt = dim->main_img_format;
547e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.snapshot.main.dim.width = dim->picture_width;
548e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.snapshot.main.dim.height = dim->picture_height;
549e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
550e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.snapshot.thumbnail.fmt = dim->thumb_format;
551e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.snapshot.thumbnail.dim.width = dim->ui_thumbnail_width;
552e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    fmt.snapshot.thumbnail.dim.height = dim->ui_thumbnail_height;
553e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
554e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: Snapshot channel fmt = main: %d thumbnail: %d", __func__,
555e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->main_img_format, dim->thumb_format);
556e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: Snapshot channel resolution = main: %dX%d  thumbnail: %dX%d",
557e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         __func__, dim->picture_width, dim->picture_height,
558e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->ui_thumbnail_width, dim->ui_thumbnail_height);
559e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
560e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Set Snapshot channel image format", __func__);
561e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_set_parm(mCameraId, MM_CAMERA_PARM_CH_IMAGE_FMT, &fmt);
562e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
563e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Set Snapshot Channel format err=%d\n", __func__, ret);
564e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
565e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
566e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
567e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
568e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
569e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
570e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
571e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
572e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: X", __func__);
573e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
574e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
575e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
576e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
577e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::
578e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevdeinitSnapshotChannel(mm_camera_channel_type_t ch_type)
579e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
580e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
581e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
582e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* unreg buf notify*/
583e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (getSnapshotState() >= SNAPSHOT_STATE_BUF_NOTIF_REGD){
584e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (NO_ERROR != cam_evt_register_buf_notify(mCameraId,
585e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                        ch_type, NULL,(mm_camera_register_buf_cb_type_t)NULL,NULL, this)) {
586e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Failure to unregister buf notification", __func__);
587e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
588e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
589e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
590e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (getSnapshotState() >= SNAPSHOT_STATE_CH_ACQUIRED) {
591e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Release snapshot channel", __func__);
592e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        cam_ops_ch_release(mCameraId, ch_type);
593e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
594e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
595e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X",__func__);
596e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
597e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
598e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
599e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevinitRawSnapshotBuffers(cam_ctrl_dimension_t *dim, int num_of_buf)
600e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
601e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
602e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    struct msm_frame *frame;
603e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t frame_len;
604e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint8_t num_planes;
605e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t planes[VIDEO_MAX_PLANES];
606e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_reg_buf_t reg_buf;
607e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
608e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
609e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&reg_buf,  0,  sizeof(mm_camera_reg_buf_t));
610e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&mSnapshotStreamBuf, 0, sizeof(mSnapshotStreamBuf));
611e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
612e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if ((num_of_buf == 0) || (num_of_buf > MM_CAMERA_MAX_NUM_FRAMES)) {
613e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Invalid number of buffers (=%d) requested!", __func__, num_of_buf);
614e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = BAD_VALUE;
615e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
616e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
617e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
618e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    reg_buf.def.buf.mp = new mm_camera_mp_buf_t[num_of_buf];
619e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!reg_buf.def.buf.mp) {
620e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGE("%s Error allocating memory for mplanar struct ", __func__);
621e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ret = NO_MEMORY;
622e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      goto end;
623e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
624e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(reg_buf.def.buf.mp, 0, num_of_buf * sizeof(mm_camera_mp_buf_t));
625e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
626e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Get a frame len for buffer to be allocated*/
627e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    frame_len = mm_camera_get_msm_frame_len(CAMERA_BAYER_SBGGR10,
628e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            myMode,
629e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            dim->raw_picture_width,
630e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            dim->raw_picture_height,
631e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            OUTPUT_TYPE_S,
632e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            &num_planes, planes);
633e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
634e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mHalCamCtrl->initHeapMem(&mHalCamCtrl->mRawMemory, num_of_buf,
635e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        frame_len, 0, planes[0], MSM_PMEM_RAW_MAINIMG,
636e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        &mSnapshotStreamBuf, &reg_buf.def,
637e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        num_planes, planes) < 0) {
638e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = NO_MEMORY;
639e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
640e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
641e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
642e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* register the streaming buffers for the channel*/
643e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    reg_buf.ch_type = MM_CAMERA_CH_RAW;
644e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    reg_buf.def.num = mSnapshotStreamBuf.num;
645e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
646e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_prepare_buf(mCameraId, &reg_buf);
647e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(ret != NO_ERROR) {
648e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGV("%s:reg snapshot buf err=%d\n", __func__, ret);
649e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
650e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mRawMemory);
651e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
652e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
653e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
654e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* If we have reached here successfully, we have allocated buffer.
655e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       Set state machine.*/
656e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    setSnapshotState(SNAPSHOT_STATE_BUF_INITIALIZED);
657e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
658e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
659e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* If it's error, we'll need to do some needful */
660e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
661e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
662e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
663e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (reg_buf.def.buf.mp)
664e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      delete []reg_buf.def.buf.mp;
665e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
666e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
667e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
668e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
669e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::deinitRawSnapshotBuffers(void)
670e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
671e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int ret = NO_ERROR;
672e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
673e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
674e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
675e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* deinit buffers only if we have already allocated */
676e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (getSnapshotState() >= SNAPSHOT_STATE_BUF_INITIALIZED ){
677e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
678e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Unpreparing Snapshot Buffer", __func__);
679e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_RAW);
680e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(ret != NO_ERROR) {
681e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s:Unreg Raw snapshot buf err=%d\n", __func__, ret);
682e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = FAILED_TRANSACTION;
683e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
684e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
685e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mRawMemory);
686e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
687e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
688e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
689e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
690e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
691e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
692e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
693e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
694e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevinitSnapshotBuffers(cam_ctrl_dimension_t *dim, int num_of_buf)
695e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
696e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
697e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    struct msm_frame *frame;
698e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t frame_len, y_off, cbcr_off;
699e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint8_t num_planes;
700e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t planes[VIDEO_MAX_PLANES];
701e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_reg_buf_t reg_buf;
702e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int rotation = 0;
703e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
704e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
705e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&reg_buf,  0,  sizeof(mm_camera_reg_buf_t));
706e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&mSnapshotStreamBuf, 0, sizeof(mSnapshotStreamBuf));
707e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
708e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if ((num_of_buf == 0) || (num_of_buf > MM_CAMERA_MAX_NUM_FRAMES)) {
709e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Invalid number of buffers (=%d) requested!",
710e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             __func__, num_of_buf);
711e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = BAD_VALUE;
712e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
713e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
714e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
715e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Mode: %d Num_of_buf: %d ImageSizes: main: %dx%d thumb: %dx%d",
716e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         __func__, myMode, num_of_buf,
717e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->picture_width, dim->picture_height,
718e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->ui_thumbnail_width, dim->ui_thumbnail_height);
719e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
720e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    reg_buf.snapshot.main.buf.mp = new mm_camera_mp_buf_t[num_of_buf];
721e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!reg_buf.snapshot.main.buf.mp) {
722e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGE("%s Error allocating memory for mplanar struct ", __func__);
723e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          ret = NO_MEMORY;
724e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          goto end;
725e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
726e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(reg_buf.snapshot.main.buf.mp, 0,
727e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      num_of_buf * sizeof(mm_camera_mp_buf_t));
728e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!isFullSizeLiveshot()) {
729e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      reg_buf.snapshot.thumbnail.buf.mp = new mm_camera_mp_buf_t[num_of_buf];
730e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if (!reg_buf.snapshot.thumbnail.buf.mp) {
731e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s Error allocating memory for mplanar struct ", __func__);
732e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = NO_MEMORY;
733e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
734e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
735e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      memset(reg_buf.snapshot.thumbnail.buf.mp, 0,
736e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        num_of_buf * sizeof(mm_camera_mp_buf_t));
737e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
738e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Number of buffers to be set*/
739e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Set the JPEG Rotation here since get_buffer_offset needs
740e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev     * the value of rotation.*/
741e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->setJpegRotation(isZSLMode());
742e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!isZSLMode())
743e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        rotation = mHalCamCtrl->getJpegRotation();
744e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else
745e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        rotation = 0;
746e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(rotation != dim->rotation) {
747e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim->rotation = rotation;
748e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_config_set_parm(mHalCamCtrl->mCameraId, MM_CAMERA_PARM_DIMENSION, dim);
749e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
750e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
751e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(isLiveSnapshot()) {
752e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_config_set_parm(mHalCamCtrl->mCameraId, MM_CAMERA_PARM_DIMENSION, dim);
753e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
754e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    num_planes = 2;
755e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    planes[0] = dim->picture_frame_offset.mp[0].len;
756e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    planes[1] = dim->picture_frame_offset.mp[1].len;
757e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    frame_len = dim->picture_frame_offset.frame_len;
758e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    y_off = dim->picture_frame_offset.mp[0].offset;
759e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cbcr_off = dim->picture_frame_offset.mp[1].offset;
760e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: main image: rotation = %d, yoff = %d, cbcroff = %d, size = %d, width = %d, height = %d",
761e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         __func__, dim->rotation, y_off, cbcr_off, frame_len, dim->picture_width, dim->picture_height);
762e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mHalCamCtrl->initHeapMem (&mHalCamCtrl->mJpegMemory, 1, frame_len, 0, cbcr_off,
763e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                  MSM_PMEM_MAX, NULL, NULL, num_planes, planes) < 0) {
764e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		LOGE("%s: Error allocating JPEG memory", __func__);
765e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		ret = NO_MEMORY;
766e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		goto end;
767e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
768e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!isLiveSnapshot()) {
769e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (mHalCamCtrl->initHeapMem(&mHalCamCtrl->mSnapshotMemory, num_of_buf,
770e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	   frame_len, y_off, cbcr_off, MSM_PMEM_MAINIMG, &mSnapshotStreamBuf,
771e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                     &reg_buf.snapshot.main, num_planes, planes) < 0) {
772e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    				ret = NO_MEMORY;
773e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mJpegMemory);
774e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    				goto end;
775e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	};
776e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        num_planes = 2;
777e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        planes[0] = dim->thumb_frame_offset.mp[0].len;
778e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        planes[1] = dim->thumb_frame_offset.mp[1].len;
779e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        frame_len = planes[0] + planes[1];
780e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (!isFullSizeLiveshot()) {
781e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	    y_off = dim->thumb_frame_offset.mp[0].offset;
782e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                cbcr_off = dim->thumb_frame_offset.mp[1].offset;
783e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	    LOGE("%s: thumbnail: rotation = %d, yoff = %d, cbcroff = %d, size = %d, width = %d, height = %d",
784e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    		__func__, dim->rotation, y_off, cbcr_off, frame_len,
785e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    		dim->thumbnail_width, dim->thumbnail_height);
786e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
787e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	    if (mHalCamCtrl->initHeapMem(&mHalCamCtrl->mThumbnailMemory, num_of_buf,
788e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    		    frame_len, y_off, cbcr_off, MSM_PMEM_THUMBNAIL, &mPostviewStreamBuf,
789e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    		    &reg_buf.snapshot.thumbnail, num_planes, planes) < 0) {
790e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	        ret = NO_MEMORY;
791e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mSnapshotMemory);
792e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mJpegMemory);
793e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	        goto end;
794e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    	    }
795e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
796e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* register the streaming buffers for the channel*/
797e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        reg_buf.ch_type = MM_CAMERA_CH_SNAPSHOT;
798e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        reg_buf.snapshot.main.num = mSnapshotStreamBuf.num;
799e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
800e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (!isFullSizeLiveshot())
801e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            reg_buf.snapshot.thumbnail.num = mPostviewStreamBuf.num;
802e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        else
803e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            reg_buf.snapshot.thumbnail.num = 0;
804e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
805e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_config_prepare_buf(mCameraId, &reg_buf);
806e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(ret != NO_ERROR) {
807e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGV("%s:reg snapshot buf err=%d\n", __func__, ret);
808e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = FAILED_TRANSACTION;
809e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (!isFullSizeLiveshot()){
810e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mThumbnailMemory);
811e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
812e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mSnapshotMemory);
813e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mJpegMemory);
814e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
815e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
816e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
817e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
818e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* If we have reached here successfully, we have allocated buffer.
819e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       Set state machine.*/
820e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    setSnapshotState(SNAPSHOT_STATE_BUF_INITIALIZED);
821e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
822e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
823e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
824e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
825e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (reg_buf.snapshot.main.buf.mp)
826e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      delete []reg_buf.snapshot.main.buf.mp;
827e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (reg_buf.snapshot.thumbnail.buf.mp)
828e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      delete []reg_buf.snapshot.thumbnail.buf.mp;
829e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
830e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
831e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
832e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
833e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
834e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevdeinitSnapshotBuffers(void)
835e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
836e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int ret = NO_ERROR;
837e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
838e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
839e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
840e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Deinit only if we have already initialized*/
841e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (getSnapshotState() >= SNAPSHOT_STATE_BUF_INITIALIZED ){
842e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
843e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(!isLiveSnapshot()) {
844e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGD("%s: Unpreparing Snapshot Buffer", __func__);
845e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_SNAPSHOT);
846e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if(ret != NO_ERROR) {
847e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                LOGE("%s:unreg snapshot buf err=%d\n", __func__, ret);
848e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                ret = FAILED_TRANSACTION;
849e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                goto end;
850e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
851e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
852e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
853e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Clear main and thumbnail heap*/
854e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(!isLiveSnapshot()) {
855e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mSnapshotMemory);
856e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (!isFullSizeLiveshot())
857e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mThumbnailMemory);
858e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
859e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mJpegMemory);
860e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
861e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
862e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
863e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
864e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
865e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
866e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::deInitBuffer(void)
867e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
868e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_channel_type_t ch_type;
869e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
870e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s: E", __func__);
871e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
872e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( getSnapshotState() == SNAPSHOT_STATE_UNINIT) {
873e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Already deinit'd!", __func__);
874e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return;
875e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
876e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
877e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mSnapshotFormat == PICTURE_FORMAT_RAW) {
878e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      /* deinit buffer */
879e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      deinitRawSnapshotBuffers();
880e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
881e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else
882e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    {
883e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if (!isZSLMode() &&
884e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ((mHalCamCtrl->getHDRMode() == HDR_MODE) || (mHalCamCtrl->isWDenoiseEnabled()))) {
885e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*register main and thumbnail buffers at back-end for frameproc*/
886e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        for (int i = 0; i < mHalCamCtrl->mSnapshotMemory.buffer_count; i++) {
887e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_MAIN, i, mCameraId,
888e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                        CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
889e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: sending unmapping data Msg Failed", __func__);
890e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          }
891e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, i, mCameraId,
892e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                        CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
893e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: sending unmapping data Msg Failed", __func__);
894e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          }
895e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
896e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
897e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
898e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      deinitSnapshotBuffers();
899e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
900e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
901e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
902e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* deinit jpeg buffer if allocated */
903e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mJpegHeap != NULL) mJpegHeap.clear();
904e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mJpegHeap = NULL;
905e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
906e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* memset some global structure */
907e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&mSnapshotStreamBuf, 0, sizeof(mSnapshotStreamBuf));
908e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&mPostviewStreamBuf, 0, sizeof(mPostviewStreamBuf));
909e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mSnapshotQueue.flush();
910e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mWDNQueue.flush();
911e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
912e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    setSnapshotState(SNAPSHOT_STATE_UNINIT);
913e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
914e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
915e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
916e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
917e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*Temp: to be removed once event handling is enabled in mm-camera.
918e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  We need an event - one event for
919e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  stream-off to disable OPS_SNAPSHOT*/
920e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::runSnapshotThread(void *data)
921e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
922e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
923e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
924e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mSnapshotFormat == PICTURE_FORMAT_RAW) {
925e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       /* TBD: Temp: Needs to be removed once event handling is enabled.
926e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          We cannot call mm-camera interface to stop snapshot from callback
927e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          function as it causes deadlock. Hence handling it here temporarily
928e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          in this thread. Later mm-camera intf will give us event in separate
929e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          thread context */
930e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mm_app_snapshot_wait();
931e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Send command to stop snapshot polling thread*/
932e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        stop();
933e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
934e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
935e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
936e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
937e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*Temp: to be removed once event handling is enabled in mm-camera*/
938e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic void *snapshot_thread(void *obj)
939e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
940e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    QCameraStream_Snapshot *pme = (QCameraStream_Snapshot *)obj;
941e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
942e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (pme != 0) {
943e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        pme->runSnapshotThread(obj);
944e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
945e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else LOGW("not starting snapshot thread: the object went away!");
946e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
947e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NULL;
948e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
949e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
950e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*Temp: to be removed later*/
951e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic pthread_t mSnapshotThread;
952e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
953e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::initJPEGSnapshot(int num_of_snapshots)
954e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
955e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
956e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dim;
957e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_op_mode_type_t op_mode;
958e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
959e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
960e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
961e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (isFullSizeLiveshot())
962e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      goto end;
963e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
964e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Get current dimension", __func__);
965e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Query mm_camera to get current dimension */
966e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
967e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_get_parm(mCameraId,
968e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                              MM_CAMERA_PARM_DIMENSION, &dim);
969e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
970e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: error - can't get preview dimension!", __func__);
971e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
972e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
973e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
974e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
975e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Set camera op mode to MM_CAMERA_OP_MODE_CAPTURE */
976e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("Setting OP_MODE_CAPTURE");
977e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    op_mode = MM_CAMERA_OP_MODE_CAPTURE;
978e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( NO_ERROR != cam_config_set_parm(mCameraId,
979e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            MM_CAMERA_PARM_OP_MODE, &op_mode)) {
980e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: MM_CAMERA_OP_MODE_CAPTURE failed", __func__);
981e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
982e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
983e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
984e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
985e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* config the parmeters and see if we need to re-init the stream*/
986e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s: Configure Snapshot Dimension", __func__);
987e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = configSnapshotDimension(&dim);
988e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
989e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Setting snapshot dimension failed", __func__);
990e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
991e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
992e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
993e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Initialize stream - set format, acquire channel */
994e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initSnapshotFormat(&dim);
995e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
996e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: error - can't init nonZSL stream!", __func__);
997e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
998e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
999e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1000e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initSnapshotBuffers(&dim, num_of_snapshots);
1001e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if ( NO_ERROR != ret ){
1002e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Failure allocating memory for Snapshot buffers", __func__);
1003e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1004e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1005e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1006e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!isZSLMode() &&
1007e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ((mHalCamCtrl->getHDRMode() == HDR_MODE) || (mHalCamCtrl->isWDenoiseEnabled()))) {
1008e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      /*register main and thumbnail buffers at back-end for frameproc*/
1009e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        for (int i = 0; i < num_of_snapshots; i++) {
1010e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          if (NO_ERROR != mHalCamCtrl->sendMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_MAIN, i,
1011e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mSnapshotStreamBuf.frame[i].fd, mHalCamCtrl->mSnapshotMemory.size, mCameraId,
1012e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                      CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
1013e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: sending mapping data Msg Failed", __func__);
1014e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          }
1015e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          if (NO_ERROR != mHalCamCtrl->sendMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, i,
1016e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mPostviewStreamBuf.frame[i].fd, mHalCamCtrl->mThumbnailMemory.size, mCameraId,
1017e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                      CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
1018e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: sending mapping data Msg Failed", __func__);
1019e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          }
1020e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1021e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1022e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1023e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1024e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Based on what state we are in, we'll need to handle error -
1025e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       like deallocating memory if we have already allocated */
1026e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1027e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
1028e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1029e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
1030e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1031e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1032e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1033e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1034e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::initRawSnapshot(int num_of_snapshots)
1035e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1036e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1037e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dim;
1038e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    bool initSnapshot = false;
1039e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_op_mode_type_t op_mode;
1040e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1041e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
1042e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1043e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Set camera op mode to MM_CAMERA_OP_MODE_CAPTURE */
1044e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Setting OP_MODE_CAPTURE", __func__);
1045e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    op_mode = MM_CAMERA_OP_MODE_CAPTURE;
1046e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( NO_ERROR != cam_config_set_parm(mCameraId,
1047e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            MM_CAMERA_PARM_OP_MODE, &op_mode)) {
1048e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: MM_CAMERA_OP_MODE_CAPTURE failed", __func__);
1049e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
1050e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1051e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1052e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1053e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* For raw snapshot, we do not know the dimension as it
1054e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       depends on sensor to sensor. We call getDimension which will
1055e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       give us raw width and height */
1056e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
1057e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
1058e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (MM_CAMERA_OK != ret) {
1059e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGE("%s: error - can't get dimension!", __func__);
1060e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGE("%s: X", __func__);
1061e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      goto end;
1062e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1063e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Raw Snapshot dimension: %dx%d", __func__,
1064e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim.raw_picture_width,
1065e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim.raw_picture_height);
1066e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1067e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1068e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initRawSnapshotChannel(&dim, num_of_snapshots);
1069e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
1070e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: error - can't init nonZSL stream!", __func__);
1071e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1072e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1073e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1074e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initRawSnapshotBuffers(&dim, num_of_snapshots);
1075e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if ( NO_ERROR != ret ){
1076e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Failure allocating memory for Raw Snapshot buffers",
1077e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             __func__);
1078e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1079e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1080e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    setSnapshotState(SNAPSHOT_STATE_INITIALIZED);
1081e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1082e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1083e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1084e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
1085e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1086e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
1087e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1088e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1089e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1090e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::initFullLiveshot(void)
1091e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1092e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1093e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dim;
1094e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    bool matching = true;
1095e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1096e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
1097e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
1098e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (MM_CAMERA_OK != ret) {
1099e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGE("%s: error - can't get dimension!", __func__);
1100e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return ret;
1101e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1102e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#if 1
1103e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* First check if the picture resolution is the same, if not, change it*/
1104e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->getPictureSize(&mPictureWidth, &mPictureHeight);
1105e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Picture size received: %d x %d", __func__,
1106e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mPictureWidth, mPictureHeight);
1107e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1108e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //Use main image as input to encoder to generate thumbnail
1109e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailWidth = dim.picture_width;
1110e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailHeight = dim.picture_height;
1111e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    matching = (mPictureWidth == dim.picture_width) &&
1112e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (mPictureHeight == dim.picture_height);
1113e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1114e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //Actual thumbnail size requested
1115e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPostviewWidth = mHalCamCtrl->mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
1116e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPostviewHeight =  mHalCamCtrl->mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
1117e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1118e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDropThumbnail = false;
1119e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mPostviewWidth == 0 && mPostviewHeight == 0) {
1120e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mPostviewWidth = THUMBNAIL_DEFAULT_WIDTH;
1121e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mPostviewHeight = THUMBNAIL_DEFAULT_HEIGHT;
1122e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         mDropThumbnail = true;
1123e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1124e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1125e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!matching) {
1126e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim.picture_width  = mPictureWidth;
1127e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim.picture_height = mPictureHeight;
1128e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim.ui_thumbnail_height = mThumbnailHeight;
1129e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dim.ui_thumbnail_width = mThumbnailWidth;
1130e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1131e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Picture size to set: %d x %d", __func__,
1132e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim.picture_width, dim.picture_height);
1133e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_set_parm(mCameraId, MM_CAMERA_PARM_DIMENSION,&dim);
1134e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#endif
1135e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Initialize stream - set format, acquire channel */
1136e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initSnapshotFormat(&dim);
1137e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
1138e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: error - can't init nonZSL stream!", __func__);
1139e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return ret;
1140e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1141e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initSnapshotBuffers(&dim, 1);
1142e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if ( NO_ERROR != ret ){
1143e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Failure allocating memory for Snapshot buffers", __func__);
1144e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return ret;
1145e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1146e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1147e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1148e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1149e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1150e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::initZSLSnapshot(void)
1151e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1152e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1153e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dim;
1154e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_op_mode_type_t op_mode;
1155e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1156e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
1157e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1158e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Get current dimension", __func__);
1159e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Query mm_camera to get current dimension */
1160e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
1161e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_get_parm(mCameraId,
1162e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                              MM_CAMERA_PARM_DIMENSION, &dim);
1163e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
1164e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: error - can't get preview dimension!", __func__);
1165e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
1166e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1167e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1168e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1169e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* config the parmeters and see if we need to re-init the stream*/
1170e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Configure Snapshot Dimension", __func__);
1171e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = configSnapshotDimension(&dim);
1172e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1173e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Setting snapshot dimension failed", __func__);
1174e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1175e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1176e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1177e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Initialize stream - set format, acquire channel */
1178e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initSnapshotFormat(&dim);
1179e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
1180e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: error - can't init nonZSL stream!", __func__);
1181e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1182e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1183e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1184e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* For ZSL we'll have to allocate buffers for internal queue
1185e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       maintained by mm-camera lib plus around 3 buffers used for
1186e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       data handling by lower layer.*/
1187e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1188e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = initSnapshotBuffers(&dim, mHalCamCtrl->getZSLQueueDepth() + 3);
1189e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if ( NO_ERROR != ret ){
1190e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Failure allocating memory for Snapshot buffers", __func__);
1191e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1192e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1193e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1194e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1195e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Based on what state we are in, we'll need to handle error -
1196e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       like deallocating memory if we have already allocated */
1197e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1198e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
1199e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1200e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
1201e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1202e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1203e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1204e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1205e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
1206e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevtakePictureJPEG(void)
1207e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1208e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1209e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1210e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
1211e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1212e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Take snapshot */
1213e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Call MM_CAMERA_OPS_SNAPSHOT", __func__);
1214e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != cam_ops_action(mCameraId,
1215e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                              TRUE,
1216e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                              MM_CAMERA_OPS_SNAPSHOT,
1217e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                              this)) {
1218e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           LOGE("%s: Failure taking snapshot", __func__);
1219e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           ret = FAILED_TRANSACTION;
1220e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           goto end;
1221e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1222e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1223e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* TBD: Temp: to be removed once event callback
1224e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       is implemented in mm-camera lib  */
1225e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_t attr;
1226e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_init(&attr);
1227e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1228e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_create(&mSnapshotThread,&attr,
1229e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                   snapshot_thread, (void *)this);
1230e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1231e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1232e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1233e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
1234e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1235e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1236e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1237e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1238e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1239e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1240e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1241e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
1242e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevtakePictureRaw(void)
1243e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1244e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1245e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1246e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
1247e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1248e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Take snapshot */
1249e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Call MM_CAMERA_OPS_SNAPSHOT", __func__);
1250e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != cam_ops_action(mCameraId,
1251e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                  TRUE,
1252e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                  MM_CAMERA_OPS_RAW,
1253e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                  this)) {
1254e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           LOGE("%s: Failure taking snapshot", __func__);
1255e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           ret = FAILED_TRANSACTION;
1256e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           goto end;
1257e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1258e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1259e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* TBD: Temp: to be removed once event callback
1260e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       is implemented in mm-camera lib  */
1261e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Wait for snapshot frame callback to return*/
1262e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_t attr;
1263e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_init(&attr);
1264e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1265e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_create(&mSnapshotThread,&attr,
1266e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                   snapshot_thread, (void *)this);
1267e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1268e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1269e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1270e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        handleError();
1271e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1272e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1273e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1274e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1275e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1276e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1277e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* This is called from vide stream object */
1278e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
1279e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevtakePictureLiveshot(mm_camera_ch_data_buf_t* recvd_frame,
1280e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    cam_ctrl_dimension_t *dim,
1281e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    int frame_len)
1282e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1283e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1284e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    common_crop_t crop_info;
1285e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //common_crop_t crop;
1286e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t aspect_ratio;
1287e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_notify_callback notifyCb;
1288e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_data_callback dataCb;
1289e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1290e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s: E", __func__);
1291e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1292e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* set flag to indicate we are doing livesnapshot */
1293e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    resetSnapshotCounters( );
1294e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    setModeLiveSnapshot(true);
1295e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1296e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mHalCamCtrl->mShutterSoundPlayed) {
1297e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        notifyShutter(&crop_info, TRUE);
1298e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1299e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    notifyShutter(&crop_info, FALSE);
1300e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->mShutterSoundPlayed = FALSE;
1301e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1302e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    // send upperlayer callback for raw image (data or notify, not both)
1303e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if((mHalCamCtrl->mDataCb) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_RAW_IMAGE)){
1304e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      dataCb = mHalCamCtrl->mDataCb;
1305e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
1306e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      dataCb = NULL;
1307e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1308e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if((mHalCamCtrl->mNotifyCb) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_RAW_IMAGE_NOTIFY)){
1309e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      notifyCb = mHalCamCtrl->mNotifyCb;
1310e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
1311e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      notifyCb = NULL;
1312e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1313e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1314e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s:Passed picture size: %d X %d", __func__,
1315e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->picture_width, dim->picture_height);
1316e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s:Passed thumbnail size: %d X %d", __func__,
1317e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         dim->ui_thumbnail_width, dim->ui_thumbnail_height);
1318e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1319e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureWidth = dim->picture_width;
1320e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureHeight = dim->picture_height;
1321e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailWidth = dim->ui_thumbnail_width;
1322e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailHeight = dim->ui_thumbnail_height;
1323e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureFormat = dim->main_img_format;
1324e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailFormat = dim->thumb_format;
1325e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1326e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&crop_info, 0, sizeof(common_crop_t));
1327e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    crop_info.in1_w = mPictureWidth;
1328e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    crop_info.in1_h = mPictureHeight;
1329e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* For low power live snapshot the thumbnail output size is set to default size.
1330e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       In case of live snapshot video buffer = thumbnail buffer. For higher resolutions
1331e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       the thumnail will be dropped if its more than 64KB. To avoid thumbnail drop
1332e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       set thumbnail as configured by application. This will be a size lower than video size*/
1333e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDropThumbnail = false;
1334e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mHalCamCtrl->thumbnailWidth == 0 &&  mHalCamCtrl->thumbnailHeight == 0) {
1335e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("Live Snapshot thumbnail will be dropped as indicated by application");
1336e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDropThumbnail = true;
1337e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev   }
1338e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    crop_info.out1_w = mHalCamCtrl->thumbnailWidth;
1339e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    crop_info.out1_h =  mHalCamCtrl->thumbnailHeight;
1340e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = encodeData(recvd_frame, &crop_info, frame_len, 0);
1341e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1342e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Failure configuring JPEG encoder", __func__);
1343e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1344e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Failure encoding this frame. Just notify upper layer
1345e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           about it.*/
1346e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(mHalCamCtrl->mDataCb &&
1347e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            (mHalCamCtrl->mMsgEnabled & MEDIA_RECORDER_MSG_COMPRESSED_IMAGE)) {
1348e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            /* get picture failed. Give jpeg callback with NULL data
1349e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             * to the application to restore to preview mode
1350e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             */
1351e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1352e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setModeLiveSnapshot(false);
1353e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1354e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1355e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1356e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (dataCb) {
1357e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      dataCb(CAMERA_MSG_RAW_IMAGE, mHalCamCtrl->mSnapshotMemory.camera_memory[0],
1358e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                           1, NULL, mHalCamCtrl->mCallbackCookie);
1359e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1360e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (notifyCb) {
1361e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      notifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mHalCamCtrl->mCallbackCookie);
1362e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1363e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1364e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1365e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s: X", __func__);
1366e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1367e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1368e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1369e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
1370e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevtakePictureZSL(void)
1371e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1372e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1373e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_ops_parm_get_buffered_frame_t param;
1374e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1375e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: E", __func__);
1376e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1377e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&param, 0, sizeof(param));
1378e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    param.ch_type = MM_CAMERA_CH_SNAPSHOT;
1379e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1380e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Take snapshot */
1381e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: Call MM_CAMERA_OPS_GET_BUFFERED_FRAME", __func__);
1382e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1383e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mNumOfSnapshot = mHalCamCtrl->getNumOfSnapshots();
1384e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != cam_ops_action(mCameraId,
1385e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                          TRUE,
1386e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                          MM_CAMERA_OPS_GET_BUFFERED_FRAME,
1387e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                          &param)) {
1388e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           LOGE("%s: Failure getting zsl frame(s)", __func__);
1389e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           ret = FAILED_TRANSACTION;
1390e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           goto end;
1391e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1392e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1393e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* TBD: Temp: to be removed once event callback
1394e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       is implemented in mm-camera lib  */
1395e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*    pthread_attr_t attr;
1396e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_init(&attr);
1397e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1398e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    pthread_create(&mSnapshotThread,&attr,
1399e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                   snapshot_thread, (void *)this);
1400e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev*/
1401e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1402e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1403e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1404e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1405e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1406e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::
1407e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevstartStreamZSL(void)
1408e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1409e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1410e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1411e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
1412e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1413e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Start ZSL - it'll start queuing the frames */
1414e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Call MM_CAMERA_OPS_ZSL", __func__);
1415e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != cam_ops_action(mCameraId,
1416e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                          TRUE,
1417e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                          MM_CAMERA_OPS_ZSL,
1418e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                          this)) {
1419e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           LOGE("%s: Failure starting ZSL stream", __func__);
1420e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           ret = FAILED_TRANSACTION;
1421e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           goto end;
1422e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1423e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1424e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1425e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1426e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1427e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1428e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1429e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1430e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t  QCameraStream_Snapshot::
1431e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevencodeData(mm_camera_ch_data_buf_t* recvd_frame,
1432e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           common_crop_t *crop_info,
1433e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           int frame_len,
1434e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           bool enqueued)
1435e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1436e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1437e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dimension;
1438e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    struct msm_frame *postviewframe;
1439e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    struct msm_frame *mainframe;
1440e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    common_crop_t crop;
1441e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_point_t main_crop_offset;
1442e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_point_t thumb_crop_offset;
1443e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int width, height;
1444e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint8_t *thumbnail_buf;
1445e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t thumbnail_fd;
1446e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1447e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    omx_jpeg_encode_params encode_params;
1448e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1449e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* If it's the only frame, we directly pass to encoder.
1450e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       If not, we'll queue it and check during next jpeg .
1451e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       Also, if the queue isn't empty then we need to queue this
1452e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       one too till its turn comes (only if it's not already
1453e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       queued up there)*/
1454e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: getSnapshotState()=%d, enqueued =%d, Q empty=%d", __func__, getSnapshotState(), enqueued, mSnapshotQueue.isEmpty());
1455e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: mNumOfRecievedJPEG=%d, mNumOfSnapshot =%d", __func__, mNumOfRecievedJPEG, mNumOfSnapshot);
1456e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if((getSnapshotState() == SNAPSHOT_STATE_JPEG_ENCODING) ||
1457e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       (!mSnapshotQueue.isEmpty() && !enqueued)){ /*busy and new buffer*/
1458e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* encoding is going on. Just queue the frame for now.*/
1459e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: JPEG encoding in progress."
1460e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             "Enqueuing frame id(%d) for later processing.", __func__,
1461e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             recvd_frame->snapshot.main.idx);
1462e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mSnapshotQueue.enqueue((void *)recvd_frame);
1463e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else if (enqueued ||
1464e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       (mNumOfRecievedJPEG != mNumOfSnapshot  && mNumOfRecievedJPEG != 0)) { /*not busy, not first*/
1465e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGD("%s: JPG not busy, not first frame.", __func__);
1466e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1467e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      // For full-size live shot, use mainimage to generate thumbnail
1468e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if (isFullSizeLiveshot()) {
1469e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          postviewframe = recvd_frame->snapshot.main.frame;
1470e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      } else {
1471e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          postviewframe = recvd_frame->snapshot.thumbnail.frame;
1472e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
1473e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mainframe = recvd_frame->snapshot.main.frame;
1474e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      cam_config_get_parm(mHalCamCtrl->mCameraId, MM_CAMERA_PARM_DIMENSION, &dimension);
1475e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGD("%s: main_fmt =%d, tb_fmt =%d", __func__, dimension.main_img_format, dimension.thumb_format);
1476e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      /*since this is the continue job, we only care about the input buffer*/
1477e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      encode_params.thumbnail_buf = (uint8_t *)postviewframe->buffer;
1478e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      encode_params.thumbnail_fd = postviewframe->fd;
1479e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      encode_params.snapshot_buf = (uint8_t *)mainframe->buffer;
1480e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      encode_params.snapshot_fd = mainframe->fd;
1481e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      encode_params.dimension = &dimension;
1482e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      /*update exif parameters in HAL*/
1483e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mHalCamCtrl->setExifTags();
1484e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1485e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      encode_params.exif_data = mHalCamCtrl->getExifData();
1486e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      encode_params.exif_numEntries = mHalCamCtrl->getExifTableNumEntries();
1487e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if (!omxJpegEncodeNext(&encode_params)){
1488e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGE("%s: Failure! JPEG encoder returned error.", __func__);
1489e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          ret = FAILED_TRANSACTION;
1490e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          goto end;
1491e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
1492e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      /* Save the pointer to the frame sent for encoding. we'll need it to
1493e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         tell kernel that we are done with the frame.*/
1494e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mCurrentFrameEncoded = recvd_frame;
1495e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      setSnapshotState(SNAPSHOT_STATE_JPEG_ENCODING);
1496e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {  /*not busy and new buffer (first job)*/
1497e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1498e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGD("%s: JPG Idle and  first frame.", __func__);
1499e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1500e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        // For full-size live shot, use mainimage to generate thumbnail
1501e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (isFullSizeLiveshot()){
1502e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            postviewframe = recvd_frame->snapshot.main.frame;
1503e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1504e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            postviewframe = recvd_frame->snapshot.thumbnail.frame;
1505e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1506e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mainframe = recvd_frame->snapshot.main.frame;
1507e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        cam_config_get_parm(mHalCamCtrl->mCameraId, MM_CAMERA_PARM_DIMENSION, &dimension);
1508e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: main_fmt =%d, tb_fmt =%d", __func__, dimension.main_img_format, dimension.thumb_format);
1509e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1510e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dimension.orig_picture_dx = mPictureWidth;
1511e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dimension.orig_picture_dy = mPictureHeight;
1512e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1513e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(!mDropThumbnail) {
1514e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if(isZSLMode()) {
1515e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                LOGI("Setting input thumbnail size to previewWidth= %d   previewheight= %d in ZSL mode",
1516e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                     mHalCamCtrl->mPreviewWidth, mHalCamCtrl->mPreviewHeight);
1517e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                dimension.thumbnail_width = width = mHalCamCtrl->mPreviewWidth;
1518e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                dimension.thumbnail_height = height = mHalCamCtrl->mPreviewHeight;
1519e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            } else {
1520e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                dimension.thumbnail_width = width = mThumbnailWidth;
1521e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                dimension.thumbnail_height = height = mThumbnailHeight;
1522e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
1523e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1524e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            dimension.thumbnail_width = width = 0;
1525e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            dimension.thumbnail_height = height = 0;
1526e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1527e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dimension.main_img_format = mPictureFormat;
1528e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        dimension.thumb_format = mThumbnailFormat;
1529e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1530e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*TBD: Move JPEG handling to the mm-camera library */
1531e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("Setting callbacks, initializing encoder and start encoding.");
1532e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD(" Passing my obj: %x", (unsigned int) this);
1533e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        set_callbacks(snapshot_jpeg_fragment_cb, snapshot_jpeg_cb, this,
1534e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             mHalCamCtrl->mJpegMemory.camera_memory[0]->data, &mJpegOffset);
1535e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        omxJpegStart();
1536e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if (mHalCamCtrl->getJpegQuality())
1537e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mm_jpeg_encoder_setMainImageQuality(mHalCamCtrl->getJpegQuality());
1538e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	else
1539e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	   mm_jpeg_encoder_setMainImageQuality(85);
1540e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1541e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Dimension to encode: main: %dx%d thumbnail: %dx%d", __func__,
1542e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             dimension.orig_picture_dx, dimension.orig_picture_dy,
1543e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             dimension.thumbnail_width, dimension.thumbnail_height);
1544e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1545e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*TBD: Pass 0 as cropinfo for now as v4l2 doesn't provide
1546e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          cropinfo. It'll be changed later.*/
1547e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memset(&crop,0,sizeof(common_crop_t));
1548e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memset(&main_crop_offset,0,sizeof(cam_point_t));
1549e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memset(&thumb_crop_offset,0,sizeof(cam_point_t));
1550e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1551e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Setting crop info */
1552e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1553e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*Main image*/
1554e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.in2_w=mCrop.snapshot.main_crop.width;// dimension.picture_width
1555e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.in2_h=mCrop.snapshot.main_crop.height;// dimension.picture_height;
1556e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (!mJpegDownscaling) {
1557e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out2_w = mPictureWidth;
1558e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out2_h = mPictureHeight;
1559e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1560e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out2_w = mActualPictureWidth;
1561e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out2_h = mActualPictureHeight;
1562e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (!crop.in2_w || !crop.in2_h) {
1563e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                crop.in2_w = mPictureWidth;
1564e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                crop.in2_h = mPictureHeight;
1565e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
1566e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1567e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        main_crop_offset.x=mCrop.snapshot.main_crop.left;
1568e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        main_crop_offset.y=mCrop.snapshot.main_crop.top;
1569e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*Thumbnail image*/
1570e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.in1_w=mCrop.snapshot.thumbnail_crop.width; //dimension.thumbnail_width;
1571e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.in1_h=mCrop.snapshot.thumbnail_crop.height; // dimension.thumbnail_height;
1572e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(isLiveSnapshot() || isFullSizeLiveshot()) {
1573e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out1_w= mHalCamCtrl->thumbnailWidth;
1574e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out1_h=  mHalCamCtrl->thumbnailHeight;
1575e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGD("Thumbnail width= %d  height= %d for livesnapshot", crop.out1_w, crop.out1_h);
1576e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1577e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out1_w = width;
1578e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            crop.out1_h = height;
1579e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1580e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        thumb_crop_offset.x=mCrop.snapshot.thumbnail_crop.left;
1581e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        thumb_crop_offset.y=mCrop.snapshot.thumbnail_crop.top;
1582e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1583e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        //update exif parameters in HAL
1584e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->initExifData();
1585e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1586e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*Fill in the encode parameters*/
1587e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.dimension = (const cam_ctrl_dimension_t *)&dimension;
1588e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        //if (!isFullSizeLiveshot()) {
1589e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.thumbnail_buf = (uint8_t *)postviewframe->buffer;
1590e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.thumbnail_fd = postviewframe->fd;
1591e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.thumbnail_offset = postviewframe->phy_offset;
1592e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.thumb_crop_offset = &thumb_crop_offset;
1593e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        //}
1594e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.snapshot_buf = (uint8_t *)mainframe->buffer;
1595e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.snapshot_fd = mainframe->fd;
1596e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.snapshot_offset = mainframe->phy_offset;
1597e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.scaling_params = &crop;
1598e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.exif_data = mHalCamCtrl->getExifData();
1599e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.exif_numEntries = mHalCamCtrl->getExifTableNumEntries();
1600e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1601e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (isLiveSnapshot() && !isFullSizeLiveshot())
1602e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.a_cbcroffset = mainframe->cbcr_off;
1603e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        else
1604e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.a_cbcroffset = -1;
1605e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.main_crop_offset = &main_crop_offset;
1606e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1607e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	    if (mDropThumbnail)
1608e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.hasThumbnail = 0;
1609e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        else
1610e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            encode_params.hasThumbnail = 1;
1611e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.thumb_crop_offset = &thumb_crop_offset;
1612e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.main_format = dimension.main_img_format;
1613e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        encode_params.thumbnail_format = dimension.thumb_format;
1614e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1615e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (!omxJpegEncode(&encode_params)){
1616e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Failure! JPEG encoder returned error.", __func__);
1617e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = FAILED_TRANSACTION;
1618e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
1619e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1620e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1621e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Save the pointer to the frame sent for encoding. we'll need it to
1622e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           tell kernel that we are done with the frame.*/
1623e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mCurrentFrameEncoded = recvd_frame;
1624e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_JPEG_ENCODING);
1625e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1626e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1627e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1628e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1629e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1630e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1631e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1632e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* Called twice - 1st to play shutter sound and 2nd to configure
1633e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev   overlay/surfaceflinger for postview */
1634e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::notifyShutter(common_crop_t *crop,
1635e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                           bool mPlayShutterSoundOnly)
1636e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1637e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
1638e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mActive && !isLiveSnapshot()) {
1639e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGE("__debbug: Snapshot thread stopped \n");
1640e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return;
1641e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1642e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mHalCamCtrl->mNotifyCb)
1643e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mHalCamCtrl->mNotifyCb(CAMERA_MSG_SHUTTER, 0, mPlayShutterSoundOnly,
1644e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                 mHalCamCtrl->mCallbackCookie);
1645e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1646e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1647e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1648e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t  QCameraStream_Snapshot::
1649e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevencodeDisplayAndSave(mm_camera_ch_data_buf_t* recvd_frame,
1650e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                     bool enqueued)
1651e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1652e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
1653e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    struct msm_frame *postview_frame;
1654e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    struct ion_flush_data cache_inv_data;
1655e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int ion_fd;
1656e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int buf_index = 0;
1657e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ssize_t offset_addr = 0;
1658e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    common_crop_t dummy_crop;
1659e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* send frame for encoding */
1660e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGE("%s: Send frame for encoding", __func__);
1661e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*TBD: Pass 0 as cropinfo for now as v4l2 doesn't provide
1662e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      cropinfo. It'll be changed later.*/
1663e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mActive) {
1664e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("Cancel Picture.. Stop is called");
1665e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return NO_ERROR;
1666e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1667e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(isZSLMode()){
1668e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGE("%s: set JPEG rotation in ZSL mode", __func__);
1669e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mHalCamCtrl->setJpegRotation(isZSLMode());
1670e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1671e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#ifdef USE_ION
1672e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*Clean out(Write-back) cache before sending for JPEG*/
1673e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&cache_inv_data, 0, sizeof(struct ion_flush_data));
1674e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1675e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cache_inv_data.vaddr = (void*)recvd_frame->snapshot.main.frame->buffer;
1676e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cache_inv_data.fd = recvd_frame->snapshot.main.frame->fd;
1677e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cache_inv_data.handle = recvd_frame->snapshot.main.frame->fd_data.handle;
1678e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cache_inv_data.length = recvd_frame->snapshot.main.frame->ion_alloc.len;
1679e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ion_fd = recvd_frame->snapshot.main.frame->ion_dev_fd;
1680e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(ion_fd > 0) {
1681e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if(ioctl(ion_fd, ION_IOC_CLEAN_INV_CACHES, &cache_inv_data) < 0)
1682e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGE("%s: Cache Invalidate failed\n", __func__);
1683e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      else {
1684e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGD("%s: Successful cache invalidate\n", __func__);
1685e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	  if(!isFullSizeLiveshot()) {
1686e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ion_fd = recvd_frame->snapshot.thumbnail.frame->ion_dev_fd;
1687e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cache_inv_data.vaddr = (void*)recvd_frame->snapshot.thumbnail.frame->buffer;
1688e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cache_inv_data.fd = recvd_frame->snapshot.thumbnail.frame->fd;
1689e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cache_inv_data.handle = recvd_frame->snapshot.thumbnail.frame->fd_data.handle;
1690e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cache_inv_data.length = recvd_frame->snapshot.thumbnail.frame->ion_alloc.len;
1691e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if(ioctl(ion_fd, ION_IOC_CLEAN_INV_CACHES, &cache_inv_data) < 0)
1692e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              LOGE("%s: Cache Invalidate failed\n", __func__);
1693e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            else
1694e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              LOGD("%s: Successful cache invalidate\n", __func__);
1695e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          }
1696e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
1697e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1698e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#endif
1699e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&dummy_crop,0,sizeof(common_crop_t));
1700e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = encodeData(recvd_frame, &dummy_crop, mSnapshotStreamBuf.frame_len,
1701e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                     enqueued);
1702e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret != NO_ERROR) {
1703e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Failure configuring JPEG encoder", __func__);
1704e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1705e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
1706e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1707e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1708e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Display postview image*/
1709e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* If it's burst mode, we won't be displaying postview of all the captured
1710e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       images - only the first one */
1711e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Burst mode flag  %d", __func__, mBurstModeFlag);
1712e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1713e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
1714e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1715e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
1716e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1717e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1718e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::receiveRawPicture(mm_camera_ch_data_buf_t* recvd_frame)
1719e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1720e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int buf_index = 0;
1721e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    common_crop_t crop;
1722e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int rc = NO_ERROR;
1723e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1724e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_notify_callback         notifyCb;
1725e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_data_callback           dataCb, jpgDataCb;
1726e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1727e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E ", __func__);
1728e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mStopCallbackLock.lock( );
1729e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mActive) {
1730e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mStopCallbackLock.unlock();
1731e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Stop receiving raw pic ", __func__);
1732e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return NO_ERROR;
1733e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1734e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1735e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->dumpFrameToFile(recvd_frame->snapshot.main.frame, HAL_DUMP_FRM_MAIN);
1736e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!isFullSizeLiveshot())
1737e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->dumpFrameToFile(recvd_frame->snapshot.thumbnail.frame,
1738e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                     HAL_DUMP_FRM_THUMBNAIL);
1739e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1740e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* If it's raw snapshot, we just want to tell upperlayer to save the image*/
1741e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mSnapshotFormat == PICTURE_FORMAT_RAW) {
1742e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Call notifyShutter 2nd time in case of RAW", __func__);
1743e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mStopCallbackLock.unlock();
1744e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(!mHalCamCtrl->mShutterSoundPlayed) {
1745e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            notifyShutter(&crop, TRUE);
1746e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1747e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        notifyShutter(&crop, FALSE);
1748e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->mShutterSoundPlayed = FALSE;
1749e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1750e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mStopCallbackLock.lock( );
1751e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Sending Raw Snapshot Callback to Upperlayer", __func__);
1752e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        buf_index = recvd_frame->def.idx;
1753e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1754e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (mHalCamCtrl->mDataCb && mActive &&
1755e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE)){
1756e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          dataCb = mHalCamCtrl->mDataCb;
1757e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1758e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          dataCb = NULL;
1759e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1760e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mStopCallbackLock.unlock();
1761e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1762e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(dataCb) {
1763e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            dataCb(
1764e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                CAMERA_MSG_COMPRESSED_IMAGE,
1765e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mHalCamCtrl->mRawMemory.camera_memory[buf_index], 0, NULL,
1766e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mHalCamCtrl->mCallbackCookie);
1767e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1768e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* TBD: Temp: To be removed once event handling is enabled */
1769e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mm_app_snapshot_done();
1770e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
1771e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*TBD: v4l2 doesn't have support to provide cropinfo along with
1772e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          frame. We'll need to query.*/
1773e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memset(&crop, 0, sizeof(common_crop_t));
1774e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1775e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /*maftab*/
1776e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        #if 0
1777e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.in1_w=mCrop.snapshot.thumbnail_crop.width;
1778e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.in1_h=mCrop.snapshot.thumbnail_crop.height;
1779e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.out1_w=mThumbnailWidth;
1780e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        crop.out1_h=mThumbnailHeight;
1781e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        #endif
1782e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1783e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Call notifyShutter 2nd time", __func__);
1784e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* The recvd_frame structre we receive from lower library is a local
1785e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           variable. So we'll need to save this structure so that we won't
1786e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           be later pointing to garbage data when that variable goes out of
1787e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           scope */
1788e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mm_camera_ch_data_buf_t* frame =
1789e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            (mm_camera_ch_data_buf_t *)malloc(sizeof(mm_camera_ch_data_buf_t));
1790e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (frame == NULL) {
1791e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Error allocating memory to save received_frame structure.", __func__);
1792e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cam_evt_buf_done(mCameraId, recvd_frame);
1793e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mStopCallbackLock.unlock();
1794e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            return BAD_VALUE;
1795e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1796e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        memcpy(frame, recvd_frame, sizeof(mm_camera_ch_data_buf_t));
1797e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1798e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        //mStopCallbackLock.lock();
1799e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1800e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        // only in ZSL mode and Wavelet Denoise is enabled, we will send frame to deamon to do WDN
1801e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (isZSLMode() && mHalCamCtrl->isWDenoiseEnabled()) {
1802e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if(mIsDoingWDN){
1803e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mWDNQueue.enqueue((void *)frame);
1804e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                LOGD("%s: Wavelet denoise is going on, queue frame", __func__);
1805e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                rc = NO_ERROR;
1806e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            } else {
1807e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                LOGD("%s: Start Wavelet denoise", __func__);
1808e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mIsDoingWDN = TRUE; // set the falg to TRUE because we are going to do WDN
1809e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1810e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                // No WDN is going on so far, we will start it here
1811e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                rc = doWaveletDenoise(frame);
1812e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                if ( NO_ERROR != rc ) {
1813e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    LOGE("%s: Error while doing wavelet denoise", __func__);
1814e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    mIsDoingWDN = FALSE;
1815e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                }
1816e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
1817e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1818e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        else {
1819e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGD("%s: encodeDisplayAndSave ", __func__);
1820e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            rc = encodeDisplayAndSave(frame, 0);
1821e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1822e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1823e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1824e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        // send upperlayer callback for raw image (data or notify, not both)
1825e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if((mHalCamCtrl->mDataCb) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_RAW_IMAGE)){
1826e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          dataCb = mHalCamCtrl->mDataCb;
1827e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1828e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          dataCb = NULL;
1829e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1830e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if((mHalCamCtrl->mNotifyCb) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_RAW_IMAGE_NOTIFY)){
1831e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          notifyCb = mHalCamCtrl->mNotifyCb;
1832e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1833e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          notifyCb = NULL;
1834e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1835e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1836e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mStopCallbackLock.unlock();
1837e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(!mHalCamCtrl->mShutterSoundPlayed) {
1838e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            notifyShutter(&crop, TRUE);
1839e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1840e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        notifyShutter(&crop, FALSE);
1841e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->mShutterSoundPlayed = FALSE;
1842e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1843e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1844e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (rc != NO_ERROR)
1845e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        {
1846e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Error while encoding/displaying/saving image", __func__);
1847e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cam_evt_buf_done(mCameraId, recvd_frame);
1848e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1849e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if(mHalCamCtrl->mDataCb &&
1850e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE)) {
1851e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                /* get picture failed. Give jpeg callback with NULL data
1852e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 * to the application to restore to preview mode
1853e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 */
1854e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                jpgDataCb = mHalCamCtrl->mDataCb;
1855e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            } else {
1856e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              jpgDataCb = NULL;
1857e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           	}
1858e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: encode err so data cb", __func__);
1859e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            //mStopCallbackLock.unlock();
1860e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (dataCb) {
1861e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              dataCb(CAMERA_MSG_RAW_IMAGE, mHalCamCtrl->mSnapshotMemory.camera_memory[0],
1862e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                   1, NULL, mHalCamCtrl->mCallbackCookie);
1863e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
1864e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (notifyCb) {
1865e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              notifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mHalCamCtrl->mCallbackCookie);
1866e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
1867e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (jpgDataCb) {
1868e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              jpgDataCb(CAMERA_MSG_COMPRESSED_IMAGE,
1869e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                       NULL, 0, NULL,
1870e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                       mHalCamCtrl->mCallbackCookie);
1871e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
1872e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1873e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (frame != NULL) {
1874e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                free(frame);
1875e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
1876e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
1877e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1878e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          //mStopCallbackLock.unlock();
1879e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          if (dataCb) {
1880e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            dataCb(CAMERA_MSG_RAW_IMAGE, mHalCamCtrl->mSnapshotMemory.camera_memory[0],
1881e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                 1, NULL, mHalCamCtrl->mCallbackCookie);
1882e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          }
1883e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          if (notifyCb) {
1884e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            notifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mHalCamCtrl->mCallbackCookie);
1885e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          }
1886e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1887e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1888e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1889e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1890e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NO_ERROR;
1891e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1892e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1893e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//-------------------------------------------------------------------
1894e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// Helper Functions
1895e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//-------------------------------------------------------------------
1896e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::handleError()
1897e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1898e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_channel_type_t ch_type;
1899e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
1900e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1901e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Depending upon the state we'll have to
1902e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       handle error */
1903e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    switch(getSnapshotState()) {
1904e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case SNAPSHOT_STATE_JPEG_ENCODING:
1905e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(mJpegHeap != NULL) mJpegHeap.clear();
1906e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mJpegHeap = NULL;
1907e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1908e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case SNAPSHOT_STATE_YUV_RECVD:
1909e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case SNAPSHOT_STATE_IMAGE_CAPTURE_STRTD:
1910e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        stopPolling();
1911e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case SNAPSHOT_STATE_INITIALIZED:
1912e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case SNAPSHOT_STATE_BUF_INITIALIZED:
1913e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (mSnapshotFormat == PICTURE_FORMAT_JPEG) {
1914e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            deinitSnapshotBuffers();
1915e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }else
1916e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        {
1917e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            deinitRawSnapshotBuffers();
1918e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1919e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case SNAPSHOT_STATE_BUF_NOTIF_REGD:
1920e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case SNAPSHOT_STATE_CH_ACQUIRED:
1921e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (mSnapshotFormat == PICTURE_FORMAT_JPEG) {
1922e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            deinitSnapshotChannel(MM_CAMERA_CH_SNAPSHOT);
1923e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }else
1924e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        {
1925e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            deinitSnapshotChannel(MM_CAMERA_CH_RAW);
1926e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
1927e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    default:
1928e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Set the state to ERROR */
1929e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_ERROR);
1930e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        break;
1931e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
1932e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1933e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
1934e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1935e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1936e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::setSnapshotState(int state)
1937e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1938e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: Setting snapshot state to: %d",
1939e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         __func__, state);
1940e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mSnapshotState = state;
1941e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1942e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1943e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevint QCameraStream_Snapshot::getSnapshotState()
1944e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1945e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return mSnapshotState;
1946e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1947e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1948e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::setModeLiveSnapshot(bool value)
1949e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1950e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mModeLiveSnapshot = value;
1951e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1952e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1953e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevbool QCameraStream_Snapshot::isLiveSnapshot(void)
1954e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1955e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return mModeLiveSnapshot;
1956e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1957e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevbool QCameraStream_Snapshot::isZSLMode()
1958e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1959e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return (myMode & CAMERA_ZSL_MODE);
1960e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1961e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1962e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::setFullSizeLiveshot(bool value)
1963e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1964e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mFullLiveshot = value;
1965e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1966e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1967e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevbool QCameraStream_Snapshot::isFullSizeLiveshot()
1968e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1969e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return mFullLiveshot;
1970e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1971e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1972e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::resetSnapshotCounters(void )
1973e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
1974e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mNumOfSnapshot = mHalCamCtrl->getNumOfSnapshots();
1975e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (mNumOfSnapshot <= 0) {
1976e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mNumOfSnapshot = 1;
1977e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
1978e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mNumOfRecievedJPEG = 0;
1979e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  LOGD("%s: Number of images to be captured: %d", __func__, mNumOfSnapshot);
1980e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
1981e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
1982e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//------------------------------------------------------------------
1983e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// Constructor and Destructor
1984e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//------------------------------------------------------------------
1985e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_Snapshot::
1986e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_Snapshot(int cameraId, camera_mode_t mode)
1987e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  : QCameraStream(cameraId,mode),
1988e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mSnapshotFormat(PICTURE_FORMAT_JPEG),
1989e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureWidth(0), mPictureHeight(0),
1990e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPictureFormat(CAMERA_YUV_420_NV21),
1991e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPostviewWidth(0), mPostviewHeight(0),
1992e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailWidth(0), mThumbnailHeight(0),
1993e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbnailFormat(CAMERA_YUV_420_NV21),
1994e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mJpegOffset(0),
1995e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mSnapshotState(SNAPSHOT_STATE_UNINIT),
1996e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mNumOfSnapshot(1),
1997e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mModeLiveSnapshot(false),
1998e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mBurstModeFlag(false),
1999e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mActualPictureWidth(0),
2000e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mActualPictureHeight(0),
2001e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mJpegDownscaling(false),
2002e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mJpegHeap(NULL),
2003e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDisplayHeap(NULL),
2004e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPostviewHeap(NULL),
2005e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mCurrentFrameEncoded(NULL),
2006e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mJpegSessionId(0),
2007e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mFullLiveshot(false),
2008e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDropThumbnail(false)
2009e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  {
2010e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
2011e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2012e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*initialize snapshot queue*/
2013e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mSnapshotQueue.init();
2014e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2015e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*initialize WDN queue*/
2016e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mWDNQueue.init();
2017e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mIsDoingWDN = FALSE;
2018e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2019e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&mSnapshotStreamBuf, 0, sizeof(mSnapshotStreamBuf));
2020e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&mPostviewStreamBuf, 0, sizeof(mPostviewStreamBuf));
2021e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mSnapshotBufferNum = 0;
2022e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mMainSize = 0;
2023e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mThumbSize = 0;
2024e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    for(int i = 0; i < mMaxSnapshotBufferCount; i++) {
2025e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mMainfd[i] = 0;
2026e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mThumbfd[i] = 0;
2027e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mCameraMemoryPtrMain[i] = NULL;
2028e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mCameraMemoryPtrThumb[i] = NULL;
2029e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2030e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*load the jpeg lib*/
2031e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mJpegSessionId = omxJpegOpen( );
2032e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
2033e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
2034e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2035e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2036e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_Snapshot::~QCameraStream_Snapshot() {
2037e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
2038e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2039e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* deinit snapshot queue */
2040e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mSnapshotQueue.isInitialized()) {
2041e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mSnapshotQueue.deinit();
2042e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2043e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* deinit snapshot queue */
2044e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mWDNQueue.isInitialized()) {
2045e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mWDNQueue.deinit();
2046e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2047e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2048e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mActive) {
2049e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        stop();
2050e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2051e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mInit) {
2052e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        release();
2053e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2054e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mInit = false;
2055e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mActive = false;
2056e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mJpegSessionId > 0) {
2057e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      omxJpegClose( );
2058e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mJpegSessionId = 0;
2059e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2060e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
2061e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2062e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2063e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2064e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//------------------------------------------------------------------
2065e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// Public Members
2066e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev//------------------------------------------------------------------
2067e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::init()
2068e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2069e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
2070e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_op_mode_type_t op_mode;
2071e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2072e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
2073e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Check the state. If we have already started snapshot
2074e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       process just return*/
2075e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (getSnapshotState() != SNAPSHOT_STATE_UNINIT) {
2076e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = isZSLMode() ? NO_ERROR : INVALID_OPERATION;
2077e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Trying to take picture while snapshot is in progress",
2078e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             __func__);
2079e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2080e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2081e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mInit = true;
2082e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2083e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
2084e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*if (ret == NO_ERROR) {
2085e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_INITIALIZED);
2086e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }*/
2087e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
2088e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
2089e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2090e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2091e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::start(void) {
2092e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
2093e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2094e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
2095e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2096e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
2097e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2098e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Keep track of number of snapshots to take - in case of
2099e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       multiple snapshot/burst mode */
2100e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2101e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if(mHalCamCtrl->isRawSnapshot()) {
2102e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Acquire Raw Snapshot Channel", __func__);
2103e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_ops_ch_acquire(mCameraId, MM_CAMERA_CH_RAW);
2104e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (NO_ERROR != ret) {
2105e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Failure Acquiring Raw Snapshot Channel error =%d\n",
2106e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 __func__, ret);
2107e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = FAILED_TRANSACTION;
2108e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
2109e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2110e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Snapshot channel is acquired */
2111e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_CH_ACQUIRED);
2112e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Register buffer notification. My object: %x",
2113e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             __func__, (unsigned int) this);
2114e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (void) cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_RAW,
2115e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        snapshot_notify_cb,
2116e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        MM_CAMERA_REG_BUF_CB_INFINITE,
2117e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        0,
2118e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        this);
2119e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Set the state to buffer notification completed */
2120e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_BUF_NOTIF_REGD);
2121e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else{
2122e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Acquire Snapshot Channel", __func__);
2123e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_ops_ch_acquire(mCameraId, MM_CAMERA_CH_SNAPSHOT);
2124e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (NO_ERROR != ret) {
2125e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Failure Acquiring Snapshot Channel error =%d\n", __func__, ret);
2126e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = FAILED_TRANSACTION;
2127e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
2128e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2129e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Snapshot channel is acquired */
2130e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_CH_ACQUIRED);
2131e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGD("%s: Register buffer notification. My object: %x",
2132e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             __func__, (unsigned int) this);
2133e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (void) cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_SNAPSHOT,
2134e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        snapshot_notify_cb,
2135e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        MM_CAMERA_REG_BUF_CB_INFINITE,
2136e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        0,
2137e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        this);
2138e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Set the state to buffer notification completed */
2139e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_BUF_NOTIF_REGD);
2140e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2141e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2142e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (isZSLMode()) {
2143e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        prepareHardware();
2144e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = initZSLSnapshot();
2145e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(ret != NO_ERROR) {
2146e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s : Error while Initializing ZSL snapshot",__func__);
2147e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            goto end;
2148e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2149e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->setExifTags();
2150e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* In case of ZSL, start will only start snapshot stream and
2151e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           continuously queue the frames in a queue. When user clicks
2152e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev           shutter we'll call get buffer from the queue and pass it on */
2153e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = startStreamZSL();
2154e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2155e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2156e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2157e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (isFullSizeLiveshot())
2158e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ret = initFullLiveshot();
2159e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2160e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Check if it's a raw snapshot or JPEG*/
2161e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mHalCamCtrl->isRawSnapshot()) {
2162e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mSnapshotFormat = PICTURE_FORMAT_RAW;
2163e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = initRawSnapshot(mNumOfSnapshot);
2164e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else{
2165e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        //JPEG
2166e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mSnapshotFormat = PICTURE_FORMAT_JPEG;
2167e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = initJPEGSnapshot(mNumOfSnapshot);
2168e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2169e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(ret != NO_ERROR) {
2170e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s : Error while Initializing snapshot",__func__);
2171e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2172e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2173e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2174e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //Update Exiftag values.
2175e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->setExifTags();
2176e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2177e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mSnapshotFormat == PICTURE_FORMAT_RAW) {
2178e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = takePictureRaw();
2179e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2180e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2181e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else{
2182e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = takePictureJPEG();
2183e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2184e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2185e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2186e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
2187e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (ret == NO_ERROR) {
2188e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        setSnapshotState(SNAPSHOT_STATE_IMAGE_CAPTURE_STRTD);
2189e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mActive = true;
2190e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
2191e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        deInitBuffer();
2192e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2193e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2194e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
2195e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
2196e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
2197e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2198e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::stopPolling(void)
2199e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2200e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_ops_type_t ops_type;
2201e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2202e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mSnapshotFormat == PICTURE_FORMAT_JPEG) {
2203e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ops_type = isZSLMode() ? MM_CAMERA_OPS_ZSL : MM_CAMERA_OPS_SNAPSHOT;
2204e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else
2205e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ops_type = MM_CAMERA_OPS_RAW;
2206e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2207e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( NO_ERROR != cam_ops_action(mCameraId, FALSE,
2208e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                          ops_type, this)) {
2209e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Failure stopping snapshot", __func__);
2210e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2211e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2212e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2213e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::stop(void)
2214e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2215e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_ops_type_t ops_type;
2216e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
2217e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2218e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
2219e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //Mutex::Autolock l(&snapshotLock);
2220e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2221e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mActive) {
2222e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      LOGV("%s: Not Active return now", __func__);
2223e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return;
2224e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2225e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mActive = false;
2226e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
2227e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (getSnapshotState() != SNAPSHOT_STATE_UNINIT) {
2228e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Stop polling for further frames */
2229e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        stopPolling();
2230e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2231e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(getSnapshotState() == SNAPSHOT_STATE_JPEG_ENCODING) {
2232e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGV("Destroy Jpeg Instance");
2233e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            omxJpegAbort();
2234e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2235e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2236e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* Depending upon current state, we'll need to allocate-deallocate-deinit*/
2237e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        deInitBuffer();
2238e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2239e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2240e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mSnapshotFormat == PICTURE_FORMAT_RAW) {
2241e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret= QCameraStream::deinitChannel(mCameraId, MM_CAMERA_CH_RAW);
2242e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(ret != MM_CAMERA_OK) {
2243e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGE("%s:Deinit RAW channel failed=%d\n", __func__, ret);
2244e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2245e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (void)cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_RAW,
2246e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            NULL,
2247e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            (mm_camera_register_buf_cb_type_t)NULL,
2248e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            NULL,
2249e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            NULL);
2250e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
2251e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret= QCameraStream::deinitChannel(mCameraId, MM_CAMERA_CH_SNAPSHOT);
2252e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(ret != MM_CAMERA_OK) {
2253e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          LOGE("%s:Deinit Snapshot channel failed=%d\n", __func__, ret);
2254e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2255e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (void)cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_SNAPSHOT,
2256e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            NULL,
2257e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            (mm_camera_register_buf_cb_type_t)NULL,
2258e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            NULL,
2259e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                            NULL);
2260e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2261e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2262e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* release is generally called in case of explicit call from
2263e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       upper-layer during disconnect. So we need to deinit everything
2264e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       whatever state we are in */
2265e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("Calling omxjpegjoin from release\n");
2266e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    omxJpegFinish();
2267e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#if 0
2268e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    omxJpegClose();
2269e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#endif
2270e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mFullLiveshot = false;
2271e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
2272e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2273e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2274e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2275e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::release()
2276e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2277e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
2278e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
2279e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //Mutex::Autolock l(&snapshotLock);
2280e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2281e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(isLiveSnapshot()) {
2282e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        deInitBuffer();
2283e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2284e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mInit){
2285e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s : Stream not Initalized",__func__);
2286e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return;
2287e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2288e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2289e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mActive) {
2290e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      this->stop();
2291e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mActive = FALSE;
2292e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2293e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2294e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* release is generally called in case of explicit call from
2295e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       upper-layer during disconnect. So we need to deinit everything
2296e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       whatever state we are in */
2297e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2298e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //deinit();
2299e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mInit = false;
2300e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
2301e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2302e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2303e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2304e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::prepareHardware()
2305e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2306e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: E", __func__);
2307e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2308e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* Prepare snapshot*/
2309e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ops_action(mCameraId,
2310e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                          TRUE,
2311e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                          MM_CAMERA_OPS_PREPARE_SNAPSHOT,
2312e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                          this);
2313e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGV("%s: X", __func__);
2314e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2315e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2316e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevsp<IMemoryHeap> QCameraStream_Snapshot::getRawHeap() const
2317e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2318e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ((mDisplayHeap != NULL) ? mDisplayHeap->mHeap : NULL);
2319e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2320e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2321e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream*
2322e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_Snapshot::createInstance(int cameraId,
2323e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      camera_mode_t mode)
2324e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2325e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2326e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  QCameraStream* pme = new QCameraStream_Snapshot(cameraId, mode);
2327e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2328e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  return pme;
2329e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2330e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2331e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::deleteInstance(QCameraStream *p)
2332e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2333e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (p){
2334e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    p->release();
2335e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    delete p;
2336e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    p = NULL;
2337e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
2338e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2339e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2340e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::notifyWDenoiseEvent(cam_ctrl_status_t status, void * cookie)
2341e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2342e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_notify_callback         notifyCb;
2343e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    camera_data_callback           dataCb, jpgDataCb;
2344e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int rc = NO_ERROR;
2345e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_ch_data_buf_t *frame = (mm_camera_ch_data_buf_t *)cookie;
2346e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2347e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGI("%s: WDN Done status (%d) received",__func__,status);
2348e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
2349e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (frame == NULL) {
2350e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: cookie is returned NULL", __func__);
2351e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
2352e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        // first unmapping the fds
2353e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_MAIN, frame->snapshot.main.idx, mCameraId,
2354e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      CAM_SOCK_MSG_TYPE_FD_UNMAPPING);
2355e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, frame->snapshot.thumbnail.idx, mCameraId,
2356e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      CAM_SOCK_MSG_TYPE_FD_UNMAPPING);
2357e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2358e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        // then do JPEG encoding
2359e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        rc = encodeDisplayAndSave(frame, 0);
2360e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2361e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2362e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    // send upperlayer callback for raw image (data or notify, not both)
2363e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if((mHalCamCtrl->mDataCb) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_RAW_IMAGE)){
2364e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      dataCb = mHalCamCtrl->mDataCb;
2365e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
2366e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      dataCb = NULL;
2367e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2368e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if((mHalCamCtrl->mNotifyCb) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_RAW_IMAGE_NOTIFY)){
2369e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      notifyCb = mHalCamCtrl->mNotifyCb;
2370e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
2371e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      notifyCb = NULL;
2372e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2373e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mHalCamCtrl->mDataCb &&
2374e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE)) {
2375e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* get picture failed. Give jpeg callback with NULL data
2376e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         * to the application to restore to preview mode
2377e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         */
2378e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        jpgDataCb = mHalCamCtrl->mDataCb;
2379e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
2380e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      jpgDataCb = NULL;
2381e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2382e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2383e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    // launch next WDN if there is more in WDN Queue
2384e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    lauchNextWDenoiseFromQueue();
2385e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2386e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mStopCallbackLock.unlock();
2387e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2388e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (rc != NO_ERROR)
2389e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    {
2390e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: Error while encoding/displaying/saving image", __func__);
2391e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (frame) {
2392e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cam_evt_buf_done(mCameraId, frame);
2393e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2394e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2395e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (dataCb) {
2396e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          dataCb(CAMERA_MSG_RAW_IMAGE, mHalCamCtrl->mSnapshotMemory.camera_memory[0],
2397e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                               1, NULL, mHalCamCtrl->mCallbackCookie);
2398e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2399e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (notifyCb) {
2400e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          notifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mHalCamCtrl->mCallbackCookie);
2401e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2402e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (jpgDataCb) {
2403e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          jpgDataCb(CAMERA_MSG_COMPRESSED_IMAGE,
2404e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                   NULL, 0, NULL,
2405e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                   mHalCamCtrl->mCallbackCookie);
2406e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2407e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2408e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (frame != NULL) {
2409e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            free(frame);
2410e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2411e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2412e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2413e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2414e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_Snapshot::lauchNextWDenoiseFromQueue()
2415e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2416e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    do {
2417e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mm_camera_ch_data_buf_t *frame = NULL;
2418e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if ( mWDNQueue.isEmpty() ||
2419e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             (NULL == (frame = (mm_camera_ch_data_buf_t *)mWDNQueue.dequeue())) ) {
2420e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            // set the flag back to FALSE when no WDN going on
2421e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mIsDoingWDN = FALSE;
2422e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            break;
2423e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2424e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2425e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if ( NO_ERROR != doWaveletDenoise(frame) ) {
2426e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGE("%s: Error while doing wavelet denoise", __func__);
2427e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (frame != NULL) {
2428e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                free(frame);
2429e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
2430e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
2431e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            // we sent out req for WDN, so we can break here
2432e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            LOGD("%s: Send out req for doing wavelet denoise, return here", __func__);
2433e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            break;
2434e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
2435e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } while (TRUE);
2436e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2437e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2438e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::doWaveletDenoise(mm_camera_ch_data_buf_t* frame)
2439e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2440e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
2441e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_sock_packet_t packet;
2442e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dim;
2443e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2444e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: E", __func__);
2445e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2446e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    // get dim on the fly
2447e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
2448e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
2449e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != ret) {
2450e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: error - can't get dimension!", __func__);
2451e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return FAILED_TRANSACTION;
2452e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2453e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2454e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    // send main frame mapping through domain socket
2455e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != mHalCamCtrl->sendMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_MAIN,
2456e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                frame->snapshot.main.idx,
2457e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                frame->snapshot.main.frame->fd,
2458e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                dim.picture_frame_offset.frame_len, mCameraId,
2459e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
2460e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: sending main frame mapping buf msg Failed", __func__);
2461e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
2462e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2463e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2464e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2465e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    // send thumbnail frame mapping through domain socket
2466e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != mHalCamCtrl->sendMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL,
2467e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                frame->snapshot.thumbnail.idx,
2468e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                frame->snapshot.thumbnail.frame->fd,
2469e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                dim.display_frame_offset.frame_len, mCameraId,
2470e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
2471e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: sending thumbnail frame mapping buf msg Failed", __func__);
2472e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
2473e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2474e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2475e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2476e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    // ask deamon to start wdn operation
2477e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (NO_ERROR != sendWDenoiseStartMsg(frame)) {
2478e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: sending thumbnail frame mapping buf msg Failed", __func__);
2479e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = FAILED_TRANSACTION;
2480e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        goto end;
2481e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2482e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2483e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
2484e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    LOGD("%s: X", __func__);
2485e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
2486e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2487e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2488e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_Snapshot::sendWDenoiseStartMsg(mm_camera_ch_data_buf_t * frame)
2489e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
2490e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_sock_packet_t packet;
2491e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&packet, 0, sizeof(cam_sock_packet_t));
2492e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    packet.msg_type = CAM_SOCK_MSG_TYPE_WDN_START;
2493e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    packet.payload.wdn_start.cookie = (unsigned long)frame;
2494e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    packet.payload.wdn_start.num_frames = MM_MAX_WDN_NUM;
2495e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    packet.payload.wdn_start.ext_mode[0] = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
2496e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    packet.payload.wdn_start.ext_mode[1] = MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL;
2497e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    packet.payload.wdn_start.frame_idx[0] = frame->snapshot.main.idx;
2498e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    packet.payload.wdn_start.frame_idx[1] = frame->snapshot.thumbnail.idx;
2499e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if ( cam_ops_sendmsg(mCameraId, &packet, sizeof(packet), 0) <= 0 ) {
2500e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        LOGE("%s: sending start wavelet denoise msg failed", __func__);
2501e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return FAILED_TRANSACTION;
2502e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
2503e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NO_ERROR;
2504e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
2505e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2506e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}; // namespace android
2507e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
2508