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