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(®_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, ®_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, ®_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(®_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 ®_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 ®_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, ®_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(¶m, 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 ¶m)) { 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