18a94683196406b83b14218d1beef66067f126a16keunyoung/* 28a94683196406b83b14218d1beef66067f126a16keunyoung * Copyright (C) 2011 The Android Open Source Project 38a94683196406b83b14218d1beef66067f126a16keunyoung * 48a94683196406b83b14218d1beef66067f126a16keunyoung * Licensed under the Apache License, Version 2.0 (the "License"); 58a94683196406b83b14218d1beef66067f126a16keunyoung * you may not use this file except in compliance with the License. 68a94683196406b83b14218d1beef66067f126a16keunyoung * You may obtain a copy of the License at 78a94683196406b83b14218d1beef66067f126a16keunyoung * 88a94683196406b83b14218d1beef66067f126a16keunyoung * http://www.apache.org/licenses/LICENSE-2.0 98a94683196406b83b14218d1beef66067f126a16keunyoung * 108a94683196406b83b14218d1beef66067f126a16keunyoung * Unless required by applicable law or agreed to in writing, software 118a94683196406b83b14218d1beef66067f126a16keunyoung * distributed under the License is distributed on an "AS IS" BASIS, 128a94683196406b83b14218d1beef66067f126a16keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a94683196406b83b14218d1beef66067f126a16keunyoung * See the License for the specific language governing permissions and 148a94683196406b83b14218d1beef66067f126a16keunyoung * limitations under the License. 158a94683196406b83b14218d1beef66067f126a16keunyoung */ 168a94683196406b83b14218d1beef66067f126a16keunyoung 178a94683196406b83b14218d1beef66067f126a16keunyoung/* 188a94683196406b83b14218d1beef66067f126a16keunyoung * Contains implementation of a class CallbackNotifier that manages callbacks set 198a94683196406b83b14218d1beef66067f126a16keunyoung * via set_callbacks, enable_msg_type, and disable_msg_type camera HAL API. 208a94683196406b83b14218d1beef66067f126a16keunyoung */ 218a94683196406b83b14218d1beef66067f126a16keunyoung 228a94683196406b83b14218d1beef66067f126a16keunyoung#define LOG_NDEBUG 0 238a94683196406b83b14218d1beef66067f126a16keunyoung#define LOG_TAG "EmulatedCamera_CallbackNotifier" 248a94683196406b83b14218d1beef66067f126a16keunyoung#include <cutils/log.h> 258a94683196406b83b14218d1beef66067f126a16keunyoung#include <MetadataBufferType.h> 268a94683196406b83b14218d1beef66067f126a16keunyoung#include "EmulatedCameraDevice.h" 278a94683196406b83b14218d1beef66067f126a16keunyoung#include "CallbackNotifier.h" 288a94683196406b83b14218d1beef66067f126a16keunyoung#include "JpegCompressor.h" 298a94683196406b83b14218d1beef66067f126a16keunyoung 308a94683196406b83b14218d1beef66067f126a16keunyoungnamespace android { 318a94683196406b83b14218d1beef66067f126a16keunyoung 328a94683196406b83b14218d1beef66067f126a16keunyoung/* String representation of camera messages. */ 338a94683196406b83b14218d1beef66067f126a16keunyoungstatic const char* lCameraMessages[] = 348a94683196406b83b14218d1beef66067f126a16keunyoung{ 358a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_ERROR", 368a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_SHUTTER", 378a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_FOCUS", 388a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_ZOOM", 398a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_PREVIEW_FRAME", 408a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_VIDEO_FRAME", 418a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_POSTVIEW_FRAME", 428a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_RAW_IMAGE", 438a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_COMPRESSED_IMAGE", 448a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_RAW_IMAGE_NOTIFY", 458a94683196406b83b14218d1beef66067f126a16keunyoung "CAMERA_MSG_PREVIEW_METADATA" 468a94683196406b83b14218d1beef66067f126a16keunyoung}; 478a94683196406b83b14218d1beef66067f126a16keunyoungstatic const int lCameraMessagesNum = sizeof(lCameraMessages) / sizeof(char*); 488a94683196406b83b14218d1beef66067f126a16keunyoung 498a94683196406b83b14218d1beef66067f126a16keunyoung/* Builds an array of strings for the given set of messages. 508a94683196406b83b14218d1beef66067f126a16keunyoung * Param: 518a94683196406b83b14218d1beef66067f126a16keunyoung * msg - Messages to get strings for, 528a94683196406b83b14218d1beef66067f126a16keunyoung * strings - Array where to save strings 538a94683196406b83b14218d1beef66067f126a16keunyoung * max - Maximum number of entries in the array. 548a94683196406b83b14218d1beef66067f126a16keunyoung * Return: 558a94683196406b83b14218d1beef66067f126a16keunyoung * Number of strings saved into the 'strings' array. 568a94683196406b83b14218d1beef66067f126a16keunyoung */ 578a94683196406b83b14218d1beef66067f126a16keunyoungstatic int GetMessageStrings(uint32_t msg, const char** strings, int max) 588a94683196406b83b14218d1beef66067f126a16keunyoung{ 598a94683196406b83b14218d1beef66067f126a16keunyoung int index = 0; 608a94683196406b83b14218d1beef66067f126a16keunyoung int out = 0; 618a94683196406b83b14218d1beef66067f126a16keunyoung while (msg != 0 && out < max && index < lCameraMessagesNum) { 628a94683196406b83b14218d1beef66067f126a16keunyoung while ((msg & 0x1) == 0 && index < lCameraMessagesNum) { 638a94683196406b83b14218d1beef66067f126a16keunyoung msg >>= 1; 648a94683196406b83b14218d1beef66067f126a16keunyoung index++; 658a94683196406b83b14218d1beef66067f126a16keunyoung } 668a94683196406b83b14218d1beef66067f126a16keunyoung if ((msg & 0x1) != 0 && index < lCameraMessagesNum) { 678a94683196406b83b14218d1beef66067f126a16keunyoung strings[out] = lCameraMessages[index]; 688a94683196406b83b14218d1beef66067f126a16keunyoung out++; 698a94683196406b83b14218d1beef66067f126a16keunyoung msg >>= 1; 708a94683196406b83b14218d1beef66067f126a16keunyoung index++; 718a94683196406b83b14218d1beef66067f126a16keunyoung } 728a94683196406b83b14218d1beef66067f126a16keunyoung } 738a94683196406b83b14218d1beef66067f126a16keunyoung 748a94683196406b83b14218d1beef66067f126a16keunyoung return out; 758a94683196406b83b14218d1beef66067f126a16keunyoung} 768a94683196406b83b14218d1beef66067f126a16keunyoung 778a94683196406b83b14218d1beef66067f126a16keunyoung/* Logs messages, enabled by the mask. */ 788a94683196406b83b14218d1beef66067f126a16keunyoungstatic void PrintMessages(uint32_t msg) 798a94683196406b83b14218d1beef66067f126a16keunyoung{ 808a94683196406b83b14218d1beef66067f126a16keunyoung const char* strs[lCameraMessagesNum]; 818a94683196406b83b14218d1beef66067f126a16keunyoung const int translated = GetMessageStrings(msg, strs, lCameraMessagesNum); 828a94683196406b83b14218d1beef66067f126a16keunyoung for (int n = 0; n < translated; n++) { 838a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV(" %s", strs[n]); 848a94683196406b83b14218d1beef66067f126a16keunyoung } 858a94683196406b83b14218d1beef66067f126a16keunyoung} 868a94683196406b83b14218d1beef66067f126a16keunyoung 878a94683196406b83b14218d1beef66067f126a16keunyoungCallbackNotifier::CallbackNotifier() 888a94683196406b83b14218d1beef66067f126a16keunyoung : mNotifyCB(NULL), 898a94683196406b83b14218d1beef66067f126a16keunyoung mDataCB(NULL), 908a94683196406b83b14218d1beef66067f126a16keunyoung mDataCBTimestamp(NULL), 918a94683196406b83b14218d1beef66067f126a16keunyoung mGetMemoryCB(NULL), 928a94683196406b83b14218d1beef66067f126a16keunyoung mCBOpaque(NULL), 938a94683196406b83b14218d1beef66067f126a16keunyoung mLastFrameTimestamp(0), 948a94683196406b83b14218d1beef66067f126a16keunyoung mFrameRefreshFreq(0), 958a94683196406b83b14218d1beef66067f126a16keunyoung mMessageEnabler(0), 968a94683196406b83b14218d1beef66067f126a16keunyoung mJpegQuality(90), 978a94683196406b83b14218d1beef66067f126a16keunyoung mVideoRecEnabled(false), 988a94683196406b83b14218d1beef66067f126a16keunyoung mTakingPicture(false) 998a94683196406b83b14218d1beef66067f126a16keunyoung{ 1008a94683196406b83b14218d1beef66067f126a16keunyoung} 1018a94683196406b83b14218d1beef66067f126a16keunyoung 1028a94683196406b83b14218d1beef66067f126a16keunyoungCallbackNotifier::~CallbackNotifier() 1038a94683196406b83b14218d1beef66067f126a16keunyoung{ 1048a94683196406b83b14218d1beef66067f126a16keunyoung} 1058a94683196406b83b14218d1beef66067f126a16keunyoung 1068a94683196406b83b14218d1beef66067f126a16keunyoung/**************************************************************************** 1078a94683196406b83b14218d1beef66067f126a16keunyoung * Camera API 1088a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/ 1098a94683196406b83b14218d1beef66067f126a16keunyoung 1108a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::setCallbacks(camera_notify_callback notify_cb, 1118a94683196406b83b14218d1beef66067f126a16keunyoung camera_data_callback data_cb, 1128a94683196406b83b14218d1beef66067f126a16keunyoung camera_data_timestamp_callback data_cb_timestamp, 1138a94683196406b83b14218d1beef66067f126a16keunyoung camera_request_memory get_memory, 1148a94683196406b83b14218d1beef66067f126a16keunyoung void* user) 1158a94683196406b83b14218d1beef66067f126a16keunyoung{ 1168a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: %p, %p, %p, %p (%p)", 1178a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, notify_cb, data_cb, data_cb_timestamp, get_memory, user); 1188a94683196406b83b14218d1beef66067f126a16keunyoung 1198a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock locker(&mObjectLock); 1208a94683196406b83b14218d1beef66067f126a16keunyoung mNotifyCB = notify_cb; 1218a94683196406b83b14218d1beef66067f126a16keunyoung mDataCB = data_cb; 1228a94683196406b83b14218d1beef66067f126a16keunyoung mDataCBTimestamp = data_cb_timestamp; 1238a94683196406b83b14218d1beef66067f126a16keunyoung mGetMemoryCB = get_memory; 1248a94683196406b83b14218d1beef66067f126a16keunyoung mCBOpaque = user; 1258a94683196406b83b14218d1beef66067f126a16keunyoung} 1268a94683196406b83b14218d1beef66067f126a16keunyoung 1278a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::enableMessage(uint msg_type) 1288a94683196406b83b14218d1beef66067f126a16keunyoung{ 1298a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: msg_type = 0x%x", __FUNCTION__, msg_type); 1308a94683196406b83b14218d1beef66067f126a16keunyoung PrintMessages(msg_type); 1318a94683196406b83b14218d1beef66067f126a16keunyoung 1328a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock locker(&mObjectLock); 1338a94683196406b83b14218d1beef66067f126a16keunyoung mMessageEnabler |= msg_type; 1348a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("**** Currently enabled messages:"); 1358a94683196406b83b14218d1beef66067f126a16keunyoung PrintMessages(mMessageEnabler); 1368a94683196406b83b14218d1beef66067f126a16keunyoung} 1378a94683196406b83b14218d1beef66067f126a16keunyoung 1388a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::disableMessage(uint msg_type) 1398a94683196406b83b14218d1beef66067f126a16keunyoung{ 1408a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: msg_type = 0x%x", __FUNCTION__, msg_type); 1418a94683196406b83b14218d1beef66067f126a16keunyoung PrintMessages(msg_type); 1428a94683196406b83b14218d1beef66067f126a16keunyoung 1438a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock locker(&mObjectLock); 1448a94683196406b83b14218d1beef66067f126a16keunyoung mMessageEnabler &= ~msg_type; 1458a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("**** Currently enabled messages:"); 1468a94683196406b83b14218d1beef66067f126a16keunyoung PrintMessages(mMessageEnabler); 1478a94683196406b83b14218d1beef66067f126a16keunyoung} 1488a94683196406b83b14218d1beef66067f126a16keunyoung 1498a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t CallbackNotifier::enableVideoRecording(int fps) 1508a94683196406b83b14218d1beef66067f126a16keunyoung{ 1518a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: FPS = %d", __FUNCTION__, fps); 1528a94683196406b83b14218d1beef66067f126a16keunyoung 1538a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock locker(&mObjectLock); 1548a94683196406b83b14218d1beef66067f126a16keunyoung mVideoRecEnabled = true; 1558a94683196406b83b14218d1beef66067f126a16keunyoung mLastFrameTimestamp = 0; 1568a94683196406b83b14218d1beef66067f126a16keunyoung mFrameRefreshFreq = 1000000000LL / fps; 1578a94683196406b83b14218d1beef66067f126a16keunyoung 1588a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 1598a94683196406b83b14218d1beef66067f126a16keunyoung} 1608a94683196406b83b14218d1beef66067f126a16keunyoung 1618a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::disableVideoRecording() 1628a94683196406b83b14218d1beef66067f126a16keunyoung{ 1638a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s:", __FUNCTION__); 1648a94683196406b83b14218d1beef66067f126a16keunyoung 1658a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock locker(&mObjectLock); 1668a94683196406b83b14218d1beef66067f126a16keunyoung mVideoRecEnabled = false; 1678a94683196406b83b14218d1beef66067f126a16keunyoung mLastFrameTimestamp = 0; 1688a94683196406b83b14218d1beef66067f126a16keunyoung mFrameRefreshFreq = 0; 1698a94683196406b83b14218d1beef66067f126a16keunyoung} 1708a94683196406b83b14218d1beef66067f126a16keunyoung 1718a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::releaseRecordingFrame(const void* opaque) 1728a94683196406b83b14218d1beef66067f126a16keunyoung{ 173c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian List<camera_memory_t*>::iterator it = mCameraMemoryTs.begin(); 174c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian for( ; it != mCameraMemoryTs.end(); ++it ) { 175c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian if ( (*it)->data == opaque ) { 176c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian (*it)->release( *it ); 177c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian mCameraMemoryTs.erase(it); 178c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian break; 179c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian } 180c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian } 1818a94683196406b83b14218d1beef66067f126a16keunyoung} 1828a94683196406b83b14218d1beef66067f126a16keunyoung 1838a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t CallbackNotifier::storeMetaDataInBuffers(bool enable) 1848a94683196406b83b14218d1beef66067f126a16keunyoung{ 1858a94683196406b83b14218d1beef66067f126a16keunyoung /* Return INVALID_OPERATION means HAL does not support metadata. So HAL will 1868a94683196406b83b14218d1beef66067f126a16keunyoung * return actual frame data with CAMERA_MSG_VIDEO_FRRAME. Return 1878a94683196406b83b14218d1beef66067f126a16keunyoung * INVALID_OPERATION to mean metadata is not supported. */ 1888a94683196406b83b14218d1beef66067f126a16keunyoung return INVALID_OPERATION; 1898a94683196406b83b14218d1beef66067f126a16keunyoung} 1908a94683196406b83b14218d1beef66067f126a16keunyoung 1918a94683196406b83b14218d1beef66067f126a16keunyoung/**************************************************************************** 1928a94683196406b83b14218d1beef66067f126a16keunyoung * Public API 1938a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/ 1948a94683196406b83b14218d1beef66067f126a16keunyoung 1958a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::cleanupCBNotifier() 1968a94683196406b83b14218d1beef66067f126a16keunyoung{ 1978a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock locker(&mObjectLock); 1988a94683196406b83b14218d1beef66067f126a16keunyoung mMessageEnabler = 0; 1998a94683196406b83b14218d1beef66067f126a16keunyoung mNotifyCB = NULL; 2008a94683196406b83b14218d1beef66067f126a16keunyoung mDataCB = NULL; 2018a94683196406b83b14218d1beef66067f126a16keunyoung mDataCBTimestamp = NULL; 2028a94683196406b83b14218d1beef66067f126a16keunyoung mGetMemoryCB = NULL; 2038a94683196406b83b14218d1beef66067f126a16keunyoung mCBOpaque = NULL; 2048a94683196406b83b14218d1beef66067f126a16keunyoung mLastFrameTimestamp = 0; 2058a94683196406b83b14218d1beef66067f126a16keunyoung mFrameRefreshFreq = 0; 2068a94683196406b83b14218d1beef66067f126a16keunyoung mJpegQuality = 90; 2078a94683196406b83b14218d1beef66067f126a16keunyoung mVideoRecEnabled = false; 2088a94683196406b83b14218d1beef66067f126a16keunyoung mTakingPicture = false; 2098a94683196406b83b14218d1beef66067f126a16keunyoung} 2108a94683196406b83b14218d1beef66067f126a16keunyoung 2118a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::onNextFrameAvailable(const void* frame, 2128a94683196406b83b14218d1beef66067f126a16keunyoung nsecs_t timestamp, 2138a94683196406b83b14218d1beef66067f126a16keunyoung EmulatedCameraDevice* camera_dev) 2148a94683196406b83b14218d1beef66067f126a16keunyoung{ 2158a94683196406b83b14218d1beef66067f126a16keunyoung if (isMessageEnabled(CAMERA_MSG_VIDEO_FRAME) && isVideoRecordingEnabled() && 2168a94683196406b83b14218d1beef66067f126a16keunyoung isNewVideoFrameTime(timestamp)) { 2178a94683196406b83b14218d1beef66067f126a16keunyoung camera_memory_t* cam_buff = 2188a94683196406b83b14218d1beef66067f126a16keunyoung mGetMemoryCB(-1, camera_dev->getFrameBufferSize(), 1, NULL); 2198a94683196406b83b14218d1beef66067f126a16keunyoung if (NULL != cam_buff && NULL != cam_buff->data) { 2208a94683196406b83b14218d1beef66067f126a16keunyoung memcpy(cam_buff->data, frame, camera_dev->getFrameBufferSize()); 2218a94683196406b83b14218d1beef66067f126a16keunyoung mDataCBTimestamp(timestamp, CAMERA_MSG_VIDEO_FRAME, 2228a94683196406b83b14218d1beef66067f126a16keunyoung cam_buff, 0, mCBOpaque); 223c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian 224c53a7a79adb8d85276f4ae63876baa11e1e49048Jun Tian mCameraMemoryTs.push_back( cam_buff ); 2258a94683196406b83b14218d1beef66067f126a16keunyoung } else { 2268a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Memory failure in CAMERA_MSG_VIDEO_FRAME", __FUNCTION__); 2278a94683196406b83b14218d1beef66067f126a16keunyoung } 2288a94683196406b83b14218d1beef66067f126a16keunyoung } 2298a94683196406b83b14218d1beef66067f126a16keunyoung 2308a94683196406b83b14218d1beef66067f126a16keunyoung if (isMessageEnabled(CAMERA_MSG_PREVIEW_FRAME)) { 2318a94683196406b83b14218d1beef66067f126a16keunyoung camera_memory_t* cam_buff = 2328a94683196406b83b14218d1beef66067f126a16keunyoung mGetMemoryCB(-1, camera_dev->getFrameBufferSize(), 1, NULL); 2338a94683196406b83b14218d1beef66067f126a16keunyoung if (NULL != cam_buff && NULL != cam_buff->data) { 2348a94683196406b83b14218d1beef66067f126a16keunyoung memcpy(cam_buff->data, frame, camera_dev->getFrameBufferSize()); 2358a94683196406b83b14218d1beef66067f126a16keunyoung mDataCB(CAMERA_MSG_PREVIEW_FRAME, cam_buff, 0, NULL, mCBOpaque); 2368a94683196406b83b14218d1beef66067f126a16keunyoung cam_buff->release(cam_buff); 2378a94683196406b83b14218d1beef66067f126a16keunyoung } else { 2388a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Memory failure in CAMERA_MSG_PREVIEW_FRAME", __FUNCTION__); 2398a94683196406b83b14218d1beef66067f126a16keunyoung } 2408a94683196406b83b14218d1beef66067f126a16keunyoung } 2418a94683196406b83b14218d1beef66067f126a16keunyoung 2428a94683196406b83b14218d1beef66067f126a16keunyoung if (mTakingPicture) { 2438a94683196406b83b14218d1beef66067f126a16keunyoung /* This happens just once. */ 2448a94683196406b83b14218d1beef66067f126a16keunyoung mTakingPicture = false; 2458a94683196406b83b14218d1beef66067f126a16keunyoung /* The sequence of callbacks during picture taking is: 2468a94683196406b83b14218d1beef66067f126a16keunyoung * - CAMERA_MSG_SHUTTER 2478a94683196406b83b14218d1beef66067f126a16keunyoung * - CAMERA_MSG_RAW_IMAGE_NOTIFY 2488a94683196406b83b14218d1beef66067f126a16keunyoung * - CAMERA_MSG_COMPRESSED_IMAGE 2498a94683196406b83b14218d1beef66067f126a16keunyoung */ 2508a94683196406b83b14218d1beef66067f126a16keunyoung if (isMessageEnabled(CAMERA_MSG_SHUTTER)) { 2518a94683196406b83b14218d1beef66067f126a16keunyoung mNotifyCB(CAMERA_MSG_SHUTTER, 0, 0, mCBOpaque); 2528a94683196406b83b14218d1beef66067f126a16keunyoung } 2538a94683196406b83b14218d1beef66067f126a16keunyoung if (isMessageEnabled(CAMERA_MSG_RAW_IMAGE_NOTIFY)) { 2548a94683196406b83b14218d1beef66067f126a16keunyoung mNotifyCB(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mCBOpaque); 2558a94683196406b83b14218d1beef66067f126a16keunyoung } 2568a94683196406b83b14218d1beef66067f126a16keunyoung if (isMessageEnabled(CAMERA_MSG_COMPRESSED_IMAGE)) { 2578a94683196406b83b14218d1beef66067f126a16keunyoung /* Compress the frame to JPEG. Note that when taking pictures, we 2588a94683196406b83b14218d1beef66067f126a16keunyoung * have requested camera device to provide us with NV21 frames. */ 2598a94683196406b83b14218d1beef66067f126a16keunyoung NV21JpegCompressor compressor; 2608a94683196406b83b14218d1beef66067f126a16keunyoung status_t res = 2618a94683196406b83b14218d1beef66067f126a16keunyoung compressor.compressRawImage(frame, camera_dev->getFrameWidth(), 2628a94683196406b83b14218d1beef66067f126a16keunyoung camera_dev->getFrameHeight(), 2638a94683196406b83b14218d1beef66067f126a16keunyoung mJpegQuality); 2648a94683196406b83b14218d1beef66067f126a16keunyoung if (res == NO_ERROR) { 2658a94683196406b83b14218d1beef66067f126a16keunyoung camera_memory_t* jpeg_buff = 2668a94683196406b83b14218d1beef66067f126a16keunyoung mGetMemoryCB(-1, compressor.getCompressedSize(), 1, NULL); 2678a94683196406b83b14218d1beef66067f126a16keunyoung if (NULL != jpeg_buff && NULL != jpeg_buff->data) { 2688a94683196406b83b14218d1beef66067f126a16keunyoung compressor.getCompressedImage(jpeg_buff->data); 2698a94683196406b83b14218d1beef66067f126a16keunyoung mDataCB(CAMERA_MSG_COMPRESSED_IMAGE, jpeg_buff, 0, NULL, mCBOpaque); 2708a94683196406b83b14218d1beef66067f126a16keunyoung jpeg_buff->release(jpeg_buff); 2718a94683196406b83b14218d1beef66067f126a16keunyoung } else { 2728a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Memory failure in CAMERA_MSG_VIDEO_FRAME", __FUNCTION__); 2738a94683196406b83b14218d1beef66067f126a16keunyoung } 2748a94683196406b83b14218d1beef66067f126a16keunyoung } else { 2758a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Compression failure in CAMERA_MSG_VIDEO_FRAME", __FUNCTION__); 2768a94683196406b83b14218d1beef66067f126a16keunyoung } 2778a94683196406b83b14218d1beef66067f126a16keunyoung } 2788a94683196406b83b14218d1beef66067f126a16keunyoung } 2798a94683196406b83b14218d1beef66067f126a16keunyoung} 2808a94683196406b83b14218d1beef66067f126a16keunyoung 2818a94683196406b83b14218d1beef66067f126a16keunyoungvoid CallbackNotifier::onCameraDeviceError(int err) 2828a94683196406b83b14218d1beef66067f126a16keunyoung{ 2838a94683196406b83b14218d1beef66067f126a16keunyoung if (isMessageEnabled(CAMERA_MSG_ERROR) && mNotifyCB != NULL) { 2848a94683196406b83b14218d1beef66067f126a16keunyoung mNotifyCB(CAMERA_MSG_ERROR, err, 0, mCBOpaque); 2858a94683196406b83b14218d1beef66067f126a16keunyoung } 2868a94683196406b83b14218d1beef66067f126a16keunyoung} 2878a94683196406b83b14218d1beef66067f126a16keunyoung 2888a94683196406b83b14218d1beef66067f126a16keunyoung/**************************************************************************** 2898a94683196406b83b14218d1beef66067f126a16keunyoung * Private API 2908a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/ 2918a94683196406b83b14218d1beef66067f126a16keunyoung 2928a94683196406b83b14218d1beef66067f126a16keunyoungbool CallbackNotifier::isNewVideoFrameTime(nsecs_t timestamp) 2938a94683196406b83b14218d1beef66067f126a16keunyoung{ 2948a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock locker(&mObjectLock); 2958a94683196406b83b14218d1beef66067f126a16keunyoung if ((timestamp - mLastFrameTimestamp) >= mFrameRefreshFreq) { 2968a94683196406b83b14218d1beef66067f126a16keunyoung mLastFrameTimestamp = timestamp; 2978a94683196406b83b14218d1beef66067f126a16keunyoung return true; 2988a94683196406b83b14218d1beef66067f126a16keunyoung } 2998a94683196406b83b14218d1beef66067f126a16keunyoung return false; 3008a94683196406b83b14218d1beef66067f126a16keunyoung} 3018a94683196406b83b14218d1beef66067f126a16keunyoung 3028a94683196406b83b14218d1beef66067f126a16keunyoung}; /* namespace android */ 303