CameraHardwareInterface.h revision 8951a97b1f8462c37e740ea5082eea0445d2c501
18951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev/* 28951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Copyright (C) 2008 The Android Open Source Project 38951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 48951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 58951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * you may not use this file except in compliance with the License. 68951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * You may obtain a copy of the License at 78951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 88951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 98951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * See the License for the specific language governing permissions and 148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * limitations under the License. 158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#ifndef ANDROID_HARDWARE_CAMERA_HARDWARE_INTERFACE_H 188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#define ANDROID_HARDWARE_CAMERA_HARDWARE_INTERFACE_H 198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <binder/IMemory.h> 218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <binder/MemoryBase.h> 228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <binder/MemoryHeapBase.h> 238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <utils/RefBase.h> 248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <surfaceflinger/ISurface.h> 258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <ui/android_native_buffer.h> 268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <ui/GraphicBuffer.h> 278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <camera/Camera.h> 288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <camera/CameraParameters.h> 298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <system/window.h> 308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <hardware/camera.h> 318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevnamespace android { 338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevtypedef void (*notify_callback)(int32_t msgType, 358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t ext1, 368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t ext2, 378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void* user); 388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevtypedef void (*data_callback)(int32_t msgType, 408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const sp<IMemory> &dataPtr, 418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void* user); 428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevtypedef void (*data_callback_timestamp)(nsecs_t timestamp, 448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t msgType, 458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const sp<IMemory> &dataPtr, 468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user); 478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev/** 498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraHardwareInterface.h defines the interface to the 508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * camera hardware abstraction layer, used for setting and getting 518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * parameters, live previewing, and taking pictures. 528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * It is a referenced counted interface with RefBase as its base class. 548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraService calls openCameraHardware() to retrieve a strong pointer to the 558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * instance of this interface and may be called multiple times. The 568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * following steps describe a typical sequence: 578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * -# After CameraService calls openCameraHardware(), getParameters() and 598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * setParameters() are used to initialize the camera instance. 608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraService calls getPreviewHeap() to establish access to the 618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * preview heap so it can be registered with SurfaceFlinger for 628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * efficient display updating while in preview mode. 638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * -# startPreview() is called. The camera instance then periodically 648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * sends the message CAMERA_MSG_PREVIEW_FRAME (if enabled) each time 658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * a new preview frame is available. If data callback code needs to use 668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * this memory after returning, it must copy the data. 678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Prior to taking a picture, CameraService calls autofocus(). When auto 698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * focusing has completed, the camera instance sends a CAMERA_MSG_FOCUS notification, 708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * which informs the application whether focusing was successful. The camera instance 718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * only sends this message once and it is up to the application to call autoFocus() 728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * again if refocusing is desired. 738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraService calls takePicture() to request the camera instance take a 758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * picture. At this point, if a shutter, postview, raw, and/or compressed callback 768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * is desired, the corresponding message must be enabled. As with CAMERA_MSG_PREVIEW_FRAME, 778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * any memory provided in a data callback must be copied if it's needed after returning. 788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevclass CameraHardwareInterface : public virtual RefBase { 818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevpublic: 828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface(hw_module_t *module, const char *name) 838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice = 0; 858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mName = name; 868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGI("Opening camera %s, this %p", name, this); 878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int rc = module->methods->open(module, name, 888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev (hw_device_t **)&mDevice); 898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (rc != OK) 908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGE("Could not open camera %s: %d", name, rc); 918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev initHalPreviewWindow(); 928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ~CameraHardwareInterface() 958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGI("Destroying camera %s", mName.string()); 978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int rc = mDevice->common.close(&mDevice->common); 988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (rc != OK) 998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGE("Could not close camera %s: %d", mName.string(), rc); 1008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** Set the ANativeWindow to which preview frames are sent */ 1038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t setPreviewWindow(const sp<ANativeWindow>& buf) 1048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s) buf %p", __FUNCTION__, mName.string(), buf.get()); 1068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->set_preview_window) { 1088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mPreviewWindow = buf; 1098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.user = this; 1108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s &mHalPreviewWindow %p mHalPreviewWindow.user %p", __FUNCTION__, 1118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev &mHalPreviewWindow, mHalPreviewWindow.user); 1128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->set_preview_window(mDevice, 1138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev buf.get() ? &mHalPreviewWindow.nw : 0); 1148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 1168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** Set the notification and data callbacks */ 1198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void setCallbacks(notify_callback notify_cb, 1208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback data_cb, 1218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback_timestamp data_cb_timestamp, 1228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void* user) 1238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mNotifyCb = notify_cb; 1258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDataCb = data_cb; 1268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDataCbTimestamp = data_cb_timestamp; 1278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mCbUser = user; 1288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 1308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->set_callbacks) { 1328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->set_callbacks(mDevice, 1338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __notify_cb, 1348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __data_cb, 1358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __data_cb_timestamp, 1368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __get_memory, 1378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev this); 1388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * The following three functions all take a msgtype, 1438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * which is a bitmask of the messages defined in 1448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * include/ui/Camera.h 1458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Enable a message, or set of messages. 1498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void enableMsgType(int32_t msgType) 1518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 1538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->enable_msg_type) 1548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->enable_msg_type(mDevice, msgType); 1558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Disable a message, or a set of messages. 1598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 1608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Once received a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), camera hal 1618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * should not rely on its client to call releaseRecordingFrame() to release 1628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * video recording frames sent out by the cameral hal before and after the 1638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME) call. Camera hal clients must not 1648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * modify/access any video recording frame after calling 1658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME). 1668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void disableMsgType(int32_t msgType) 1688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 1708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->disable_msg_type) 1718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->disable_msg_type(mDevice, msgType); 1728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Query whether a message, or a set of messages, is enabled. 1768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Note that this is operates as an AND, if any of the messages 1778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * queried are off, this will return false. 1788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int msgTypeEnabled(int32_t msgType) 1808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 1828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->msg_type_enabled) 1838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->msg_type_enabled(mDevice, msgType); 1848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return false; 1858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Start preview mode. 1898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t startPreview() 1918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 1938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->start_preview) 1948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->start_preview(mDevice); 1958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 1968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Stop a previously started preview. 2008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void stopPreview() 2028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 2048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->stop_preview) 2058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->stop_preview(mDevice); 2068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Returns true if preview is enabled. 2108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int previewEnabled() 2128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 2148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->preview_enabled) 2158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->preview_enabled(mDevice); 2168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return false; 2178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Request the camera hal to store meta data or real YUV data in 2218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the video buffers send out via CAMERA_MSG_VIDEO_FRRAME for a 2228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * recording session. If it is not called, the default camera 2238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * hal behavior is to store real YUV data in the video buffers. 2248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * This method should be called before startRecording() in order 2268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * to be effective. 2278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * If meta data is stored in the video buffers, it is up to the 2298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * receiver of the video buffers to interpret the contents and 2308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * to find the actual frame data with the help of the meta data 2318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * in the buffer. How this is done is outside of the scope of 2328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * this method. 2338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Some camera hal may not support storing meta data in the video 2358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * buffers, but all camera hal should support storing real YUV data 2368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * in the video buffers. If the camera hal does not support storing 2378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the meta data in the video buffers when it is requested to do 2388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * do, INVALID_OPERATION must be returned. It is very useful for 2398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the camera hal to pass meta data rather than the actual frame 2408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * data directly to the video encoder, since the amount of the 2418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * uncompressed frame data can be very large if video size is large. 2428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * @param enable if true to instruct the camera hal to store 2448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * meta data in the video buffers; false to instruct 2458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the camera hal to store real YUV data in the video 2468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * buffers. 2478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * @return OK on success. 2498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t storeMetaDataInBuffers(int enable) 2528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 2548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->store_meta_data_in_buffers) 2558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->store_meta_data_in_buffers(mDevice, enable); 2568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return enable ? INVALID_OPERATION: OK; 2578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Start record mode. When a record image is available a CAMERA_MSG_VIDEO_FRAME 2618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * message is sent with the corresponding frame. Every record frame must be released 2628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * by a cameral hal client via releaseRecordingFrame() before the client calls 2638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME). After the client calls 2648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is camera hal's responsibility 2658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * to manage the life-cycle of the video recording frames, and the client must 2668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * not modify/access any video recording frames. 2678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t startRecording() 2698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 2718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->start_recording) 2728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->start_recording(mDevice); 2738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 2748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Stop a previously started recording. 2788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void stopRecording() 2808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 2828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->stop_recording) 2838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->stop_recording(mDevice); 2848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Returns true if recording is enabled. 2888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int recordingEnabled() 2908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 2928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->recording_enabled) 2938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->recording_enabled(mDevice); 2948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return false; 2958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME. 2998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 3008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * It is camera hal client's responsibility to release video recording 3018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * frames sent out by the camera hal before the camera hal receives 3028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME). After it receives 3038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is camera hal's 3048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * responsibility of managing the life-cycle of the video recording 3058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * frames. 3068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void releaseRecordingFrame(const sp<IMemory>& mem) 3088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 3108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->release_recording_frame) { 3118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ssize_t offset; 3128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev size_t size; 3138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 3148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *data = ((uint8_t *)heap->base()) + offset; 3158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->release_recording_frame(mDevice, data); 3168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Start auto focus, the notification callback routine is called 3218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * with CAMERA_MSG_FOCUS once when focusing is complete. autoFocus() 3228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * will be called again if another auto focus is needed. 3238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t autoFocus() 3258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 3278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->auto_focus) 3288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->auto_focus(mDevice); 3298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Cancels auto-focus function. If the auto-focus is still in progress, 3348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * this function will cancel it. Whether the auto-focus is in progress 3358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * or not, this function will return the focus position to the default. 3368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * If the camera does not support auto-focus, this is a no-op. 3378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t cancelAutoFocus() 3398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 3418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->cancel_auto_focus) 3428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->cancel_auto_focus(mDevice); 3438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Take a picture. 3488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t takePicture() 3508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 3528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->take_picture) 3538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->take_picture(mDevice); 3548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Cancel a picture that was started with takePicture. Calling this 3598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * method when no picture is being taken is a no-op. 3608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t cancelPicture() 3628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 3648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->cancel_picture) 3658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->cancel_picture(mDevice); 3668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Set the camera parameters. This returns BAD_VALUE if any parameter is 3718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * invalid or not supported. */ 3728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t setParameters(const CameraParameters ¶ms) 3738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 3758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->set_parameters) 3768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->set_parameters(mDevice, 3778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev params.flatten().string()); 3788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** Return the camera parameters. */ 3828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraParameters getParameters() const 3838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 3858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraParameters parms; 3868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->get_parameters) { 3878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev char *temp = mDevice->ops->get_parameters(mDevice); 3888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev String8 str_parms(temp); 3898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev free(temp); 3908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev parms.unflatten(str_parms); 3918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return parms; 3938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Send command to camera driver. 3978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 3998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 4018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->send_command) 4028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->send_command(mDevice, cmd, arg1, arg2); 4038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 4048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 4078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Release the hardware resources owned by this object. Note that this is 4088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * *not* done in the destructor. 4098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 4108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void release() { 4118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 4128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->release) 4138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->release(mDevice); 4148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 4178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Dump state of the camera hardware 4188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 4198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t dump(int fd, const Vector<String16>& args) const 4208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s(%s)", __FUNCTION__, mName.string()); 4228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->dump) 4238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->dump(mDevice, fd); 4248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return OK; // It's fine if the HAL doesn't implement dump() 4258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevprivate: 4288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev camera_device_t *mDevice; 4298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev String8 mName; 4308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static void __notify_cb(int32_t msg_type, int32_t ext1, 4328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t ext2, void *user) 4338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s", __FUNCTION__); 4358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 4368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static_cast<CameraHardwareInterface *>(user); 4378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __this->mNotifyCb(msg_type, ext1, ext2, __this->mCbUser); 4388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static void __data_cb(int32_t msg_type, 4418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const camera_memory_t *data, 4428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user) 4438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s", __FUNCTION__); 4458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 4468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static_cast<CameraHardwareInterface *>(user); 4478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle)); 4488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __this->mDataCb(msg_type, mem, __this->mCbUser); 4498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static void __data_cb_timestamp(nsecs_t timestamp, int32_t msg_type, 4528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const camera_memory_t *data, 4538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user) 4548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev LOGV("%s", __FUNCTION__); 4568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 4578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static_cast<CameraHardwareInterface *>(user); 4588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // Start refcounting the heap object from here on. When the clients 4598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // drop all references, it will be destroyed (as well as the enclosed 4608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // MemoryHeapBase. 4618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle)); 4628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __this->mDataCbTimestamp(timestamp, msg_type, mem, __this->mCbUser); 4638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // This is a utility class that combines a MemoryHeapBase and a MemoryBase 4668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // in one. Since we tend to use them in a one-to-one relationship, this is 4678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // handy. 4688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev class CameraHeapMemory : public MemoryBase { 4708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev public: 4718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHeapMemory(size_t size) : 4728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev MemoryBase(new MemoryHeapBase(size), 0, size) 4738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev handle.data = getHeap()->base(); 4758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev handle.size = size; 4768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev handle.handle = this; 4778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev camera_memory_t handle; 4808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev }; 4818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static camera_memory_t* __get_memory(size_t size, 4838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user __attribute__((unused))) 4848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // We allocate the object here, but we do not assign it to a strong 4868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // pointer yet. The HAL will pass it back to us via the data callback 4878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // or the data-timestamp callback, and from there on we will wrap it 4888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // within a strong pointer. 4898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHeapMemory *mem = new CameraHeapMemory(size); 4918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return &mem->handle; 4928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static ANativeWindow *__to_anw(void *user) 4958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 4978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev reinterpret_cast<CameraHardwareInterface *>(user); 4988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return __this->mPreviewWindow.get(); 4998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#define anw(n) __to_anw(((struct camera_preview_window *)n)->user) 5018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __dequeue_buffer(struct preview_stream_ops* w, 5038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev buffer_handle_t** buffer) 5048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int rc; 5068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev struct android_native_buffer_t* anb; 5088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev rc = a->dequeueBuffer(a, &anb); 5098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (!rc) { 5108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev rc = a->lockBuffer(a, anb); 5118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (!rc) 5128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev *buffer = &anb->handle; 5138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev else 5148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev a->cancelBuffer(a, anb); 5158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return rc; 5178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#ifndef container_of 5208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#define container_of(ptr, type, member) ({ \ 5218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const typeof(((type *) 0)->member) *__mptr = (ptr); \ 5228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev (type *) ((char *) __mptr - (char *)(&((type *)0)->member)); }) 5238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#endif 5248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __enqueue_buffer(struct preview_stream_ops* w, 5268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev buffer_handle_t* buffer) 5278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->queueBuffer(a, 5308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev container_of(buffer, android_native_buffer_t, handle)); 5318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __cancel_buffer(struct preview_stream_ops* w, 5348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev buffer_handle_t* buffer) 5358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->cancelBuffer(a, 5388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev container_of(buffer, android_native_buffer_t, handle)); 5398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_buffer_count(struct preview_stream_ops* w, int count) 5428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->perform(a, NATIVE_WINDOW_SET_BUFFER_COUNT, count); 5458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_buffers_geometry(struct preview_stream_ops* w, 5488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int width, int height, int format) 5498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->perform(a, NATIVE_WINDOW_SET_BUFFERS_GEOMETRY, 5528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev width, height, format); 5538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_crop(struct preview_stream_ops *w, 5568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int left, int top, int right, int bottom) 5578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev android_native_rect_t crop; 5608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.left = left; 5618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.top = top; 5628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.right = right; 5638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.bottom = bottom; 5648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->perform(a, NATIVE_WINDOW_SET_CROP, &crop); 5658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_usage(struct preview_stream_ops* w, int usage) 5688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->perform(a, NATIVE_WINDOW_SET_USAGE, usage); 5718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_swap_interval(struct preview_stream_ops *w, int interval) 5748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->setSwapInterval(a, interval); 5778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __get_min_undequeued_buffer_count( 5808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const struct preview_stream_ops *w, 5818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int *count) 5828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->query(a, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, count); 5858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void initHalPreviewWindow() 5888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer; 5908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer; 5918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer; 5928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count; 5938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_buffers_geometry = __set_buffers_geometry; 5948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_crop = __set_crop; 5958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_usage = __set_usage; 5968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_swap_interval = __set_swap_interval; 5978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.get_min_undequeued_buffer_count = 5998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __get_min_undequeued_buffer_count; 6008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<ANativeWindow> mPreviewWindow; 6038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev struct camera_preview_window { 6058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev struct preview_stream_ops nw; 6068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user; 6078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev }; 6088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev struct camera_preview_window mHalPreviewWindow; 6108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev notify_callback mNotifyCb; 6128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback mDataCb; 6138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback_timestamp mDataCbTimestamp; 6148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *mCbUser; 6158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev}; 6168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev}; // namespace android 6188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#endif 620