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 <ui/GraphicBuffer.h> 258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <camera/Camera.h> 268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <camera/CameraParameters.h> 278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <system/window.h> 288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#include <hardware/camera.h> 298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevnamespace android { 318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevtypedef void (*notify_callback)(int32_t msgType, 338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t ext1, 348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t ext2, 358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void* user); 368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevtypedef void (*data_callback)(int32_t msgType, 388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const sp<IMemory> &dataPtr, 39ff09ef8f18eed29bce50c7817df2fd52d2b50cf6Wu-cheng Li camera_frame_metadata_t *metadata, 408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void* user); 418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevtypedef void (*data_callback_timestamp)(nsecs_t timestamp, 438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t msgType, 448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const sp<IMemory> &dataPtr, 458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user); 468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev/** 488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraHardwareInterface.h defines the interface to the 498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * camera hardware abstraction layer, used for setting and getting 508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * parameters, live previewing, and taking pictures. 518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * It is a referenced counted interface with RefBase as its base class. 538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraService calls openCameraHardware() to retrieve a strong pointer to the 548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * instance of this interface and may be called multiple times. The 558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * following steps describe a typical sequence: 568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * -# After CameraService calls openCameraHardware(), getParameters() and 588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * setParameters() are used to initialize the camera instance. 598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraService calls getPreviewHeap() to establish access to the 608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * preview heap so it can be registered with SurfaceFlinger for 618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * efficient display updating while in preview mode. 628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * -# startPreview() is called. The camera instance then periodically 638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * sends the message CAMERA_MSG_PREVIEW_FRAME (if enabled) each time 648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * a new preview frame is available. If data callback code needs to use 658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * this memory after returning, it must copy the data. 668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Prior to taking a picture, CameraService calls autofocus(). When auto 688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * focusing has completed, the camera instance sends a CAMERA_MSG_FOCUS notification, 698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * which informs the application whether focusing was successful. The camera instance 708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * only sends this message once and it is up to the application to call autoFocus() 718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * again if refocusing is desired. 728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * CameraService calls takePicture() to request the camera instance take a 748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * picture. At this point, if a shutter, postview, raw, and/or compressed callback 758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * is desired, the corresponding message must be enabled. As with CAMERA_MSG_PREVIEW_FRAME, 768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * any memory provided in a data callback must be copied if it's needed after returning. 778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevclass CameraHardwareInterface : public virtual RefBase { 808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevpublic: 815861a9a98c641261c4807c976c750e4611b3a57dTyler Luu CameraHardwareInterface(const char *name) 828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice = 0; 848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mName = name; 858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ~CameraHardwareInterface() 888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 89df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Destroying camera %s", mName.string()); 905861a9a98c641261c4807c976c750e4611b3a57dTyler Luu if(mDevice) { 915861a9a98c641261c4807c976c750e4611b3a57dTyler Luu int rc = mDevice->common.close(&mDevice->common); 925861a9a98c641261c4807c976c750e4611b3a57dTyler Luu if (rc != OK) 9329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Could not close camera %s: %d", mName.string(), rc); 945861a9a98c641261c4807c976c750e4611b3a57dTyler Luu } 955861a9a98c641261c4807c976c750e4611b3a57dTyler Luu } 965861a9a98c641261c4807c976c750e4611b3a57dTyler Luu 975861a9a98c641261c4807c976c750e4611b3a57dTyler Luu status_t initialize(hw_module_t *module) 985861a9a98c641261c4807c976c750e4611b3a57dTyler Luu { 99df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Opening camera %s", mName.string()); 1005861a9a98c641261c4807c976c750e4611b3a57dTyler Luu int rc = module->methods->open(module, mName.string(), 1015861a9a98c641261c4807c976c750e4611b3a57dTyler Luu (hw_device_t **)&mDevice); 1025861a9a98c641261c4807c976c750e4611b3a57dTyler Luu if (rc != OK) { 10329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Could not open camera %s: %d", mName.string(), rc); 1045861a9a98c641261c4807c976c750e4611b3a57dTyler Luu return rc; 1055861a9a98c641261c4807c976c750e4611b3a57dTyler Luu } 1065861a9a98c641261c4807c976c750e4611b3a57dTyler Luu initHalPreviewWindow(); 1075861a9a98c641261c4807c976c750e4611b3a57dTyler Luu return rc; 1088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** Set the ANativeWindow to which preview frames are sent */ 1118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t setPreviewWindow(const sp<ANativeWindow>& buf) 1128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s) buf %p", __FUNCTION__, mName.string(), buf.get()); 1148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->set_preview_window) { 1168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mPreviewWindow = buf; 1178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.user = this; 1183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s &mHalPreviewWindow %p mHalPreviewWindow.user %p", __FUNCTION__, 1198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev &mHalPreviewWindow, mHalPreviewWindow.user); 1208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->set_preview_window(mDevice, 1218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev buf.get() ? &mHalPreviewWindow.nw : 0); 1228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 1248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** Set the notification and data callbacks */ 1278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void setCallbacks(notify_callback notify_cb, 1288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback data_cb, 1298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback_timestamp data_cb_timestamp, 1308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void* user) 1318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mNotifyCb = notify_cb; 1338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDataCb = data_cb; 1348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDataCbTimestamp = data_cb_timestamp; 1358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mCbUser = user; 1368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 1388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->set_callbacks) { 1408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->set_callbacks(mDevice, 1418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __notify_cb, 1428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __data_cb, 1438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __data_cb_timestamp, 1448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __get_memory, 1458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev this); 1468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * The following three functions all take a msgtype, 1518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * which is a bitmask of the messages defined in 1528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * include/ui/Camera.h 1538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Enable a message, or set of messages. 1578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void enableMsgType(int32_t msgType) 1598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 1618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->enable_msg_type) 1628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->enable_msg_type(mDevice, msgType); 1638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Disable a message, or a set of messages. 1678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 1688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Once received a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), camera hal 1698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * should not rely on its client to call releaseRecordingFrame() to release 1708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * video recording frames sent out by the cameral hal before and after the 1718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME) call. Camera hal clients must not 1728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * modify/access any video recording frame after calling 1738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME). 1748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void disableMsgType(int32_t msgType) 1768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 1788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->disable_msg_type) 1798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->disable_msg_type(mDevice, msgType); 1808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Query whether a message, or a set of messages, is enabled. 1848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Note that this is operates as an AND, if any of the messages 1858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * queried are off, this will return false. 1868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int msgTypeEnabled(int32_t msgType) 1888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 1893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 1908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->msg_type_enabled) 1918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->msg_type_enabled(mDevice, msgType); 1928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return false; 1938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 1948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 1958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 1968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Start preview mode. 1978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 1988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t startPreview() 1998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 2018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->start_preview) 2028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->start_preview(mDevice); 2038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 2048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Stop a previously started preview. 2088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void stopPreview() 2108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 2128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->stop_preview) 2138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->stop_preview(mDevice); 2148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Returns true if preview is enabled. 2188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int previewEnabled() 2208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 2228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->preview_enabled) 2238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->preview_enabled(mDevice); 2248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return false; 2258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Request the camera hal to store meta data or real YUV data in 2298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the video buffers send out via CAMERA_MSG_VIDEO_FRRAME for a 2308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * recording session. If it is not called, the default camera 2318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * hal behavior is to store real YUV data in the video buffers. 2328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * This method should be called before startRecording() in order 2348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * to be effective. 2358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * If meta data is stored in the video buffers, it is up to the 2378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * receiver of the video buffers to interpret the contents and 2388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * to find the actual frame data with the help of the meta data 2398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * in the buffer. How this is done is outside of the scope of 2408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * this method. 2418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Some camera hal may not support storing meta data in the video 2438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * buffers, but all camera hal should support storing real YUV data 2448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * in the video buffers. If the camera hal does not support storing 2458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the meta data in the video buffers when it is requested to do 2468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * do, INVALID_OPERATION must be returned. It is very useful for 2478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the camera hal to pass meta data rather than the actual frame 2488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * data directly to the video encoder, since the amount of the 2498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * uncompressed frame data can be very large if video size is large. 2508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * @param enable if true to instruct the camera hal to store 2528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * meta data in the video buffers; false to instruct 2538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the camera hal to store real YUV data in the video 2548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * buffers. 2558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 2568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * @return OK on success. 2578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t storeMetaDataInBuffers(int enable) 2608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 2628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->store_meta_data_in_buffers) 2638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->store_meta_data_in_buffers(mDevice, enable); 2648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return enable ? INVALID_OPERATION: OK; 2658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Start record mode. When a record image is available a CAMERA_MSG_VIDEO_FRAME 2698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * message is sent with the corresponding frame. Every record frame must be released 2708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * by a cameral hal client via releaseRecordingFrame() before the client calls 2718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME). After the client calls 2728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is camera hal's responsibility 2738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * to manage the life-cycle of the video recording frames, and the client must 2748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * not modify/access any video recording frames. 2758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t startRecording() 2778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 2798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->start_recording) 2808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->start_recording(mDevice); 2818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 2828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Stop a previously started recording. 2868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void stopRecording() 2888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 2908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->stop_recording) 2918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->stop_recording(mDevice); 2928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 2938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 2948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 2958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Returns true if recording is enabled. 2968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 2978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int recordingEnabled() 2988951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 2993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->recording_enabled) 3018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->recording_enabled(mDevice); 3028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return false; 3038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME. 3078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * 3088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * It is camera hal client's responsibility to release video recording 3098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * frames sent out by the camera hal before the camera hal receives 3108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME). After it receives 3118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * the call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is camera hal's 3128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * responsibility of managing the life-cycle of the video recording 3138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * frames. 3148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void releaseRecordingFrame(const sp<IMemory>& mem) 3168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->release_recording_frame) { 3198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ssize_t offset; 3208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev size_t size; 3218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 3228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *data = ((uint8_t *)heap->base()) + offset; 3238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->release_recording_frame(mDevice, data); 3248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Start auto focus, the notification callback routine is called 3298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * with CAMERA_MSG_FOCUS once when focusing is complete. autoFocus() 3308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * will be called again if another auto focus is needed. 3318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3328951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t autoFocus() 3338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->auto_focus) 3368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->auto_focus(mDevice); 3378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Cancels auto-focus function. If the auto-focus is still in progress, 3428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * this function will cancel it. Whether the auto-focus is in progress 3438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * or not, this function will return the focus position to the default. 3448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * If the camera does not support auto-focus, this is a no-op. 3458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t cancelAutoFocus() 3478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->cancel_auto_focus) 3508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->cancel_auto_focus(mDevice); 3518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Take a picture. 3568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t takePicture() 3588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->take_picture) 3618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->take_picture(mDevice); 3628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Cancel a picture that was started with takePicture. Calling this 3678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * method when no picture is being taken is a no-op. 3688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 3698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t cancelPicture() 3708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->cancel_picture) 3738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->cancel_picture(mDevice); 3748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 3788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Set the camera parameters. This returns BAD_VALUE if any parameter is 3798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * invalid or not supported. */ 3808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t setParameters(const CameraParameters ¶ms) 3818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->set_parameters) 3848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->set_parameters(mDevice, 3858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev params.flatten().string()); 3868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 3878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 3888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 3898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** Return the camera parameters. */ 3908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraParameters getParameters() const 3918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 3923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 3938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraParameters parms; 3948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->get_parameters) { 3958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev char *temp = mDevice->ops->get_parameters(mDevice); 3968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev String8 str_parms(temp); 39785fb61eb8b39d4d3fcebc796c3f7ade1d58567aaIliyan Malchev if (mDevice->ops->put_parameters) 39885fb61eb8b39d4d3fcebc796c3f7ade1d58567aaIliyan Malchev mDevice->ops->put_parameters(mDevice, temp); 39985fb61eb8b39d4d3fcebc796c3f7ade1d58567aaIliyan Malchev else 40085fb61eb8b39d4d3fcebc796c3f7ade1d58567aaIliyan Malchev free(temp); 4018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev parms.unflatten(str_parms); 4028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return parms; 4048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4068951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 4078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Send command to camera driver. 4088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 4098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 4108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 4128951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->send_command) 4138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->send_command(mDevice, cmd, arg1, arg2); 4148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return INVALID_OPERATION; 4158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 4188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Release the hardware resources owned by this object. Note that this is 4198951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * *not* done in the destructor. 4208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 4218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void release() { 4223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 4238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->release) 4248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mDevice->ops->release(mDevice); 4258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev /** 4288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev * Dump state of the camera hardware 4298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev */ 4308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev status_t dump(int fd, const Vector<String16>& args) const 4318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s(%s)", __FUNCTION__, mName.string()); 4338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (mDevice->ops->dump) 4348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return mDevice->ops->dump(mDevice, fd); 4358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return OK; // It's fine if the HAL doesn't implement dump() 4368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4378951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4388951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchevprivate: 4398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev camera_device_t *mDevice; 4408951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev String8 mName; 4418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static void __notify_cb(int32_t msg_type, int32_t ext1, 4438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int32_t ext2, void *user) 4448951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s", __FUNCTION__); 4468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 4478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static_cast<CameraHardwareInterface *>(user); 4488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __this->mNotifyCb(msg_type, ext1, ext2, __this->mCbUser); 4498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static void __data_cb(int32_t msg_type, 45226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev const camera_memory_t *data, unsigned int index, 453ff09ef8f18eed29bce50c7817df2fd52d2b50cf6Wu-cheng Li camera_frame_metadata_t *metadata, 4548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user) 4558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s", __FUNCTION__); 4578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 4588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static_cast<CameraHardwareInterface *>(user); 4598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle)); 46026adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev if (index >= mem->mNumBufs) { 46129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__, 46226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev index, mem->mNumBufs); 46326adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev return; 46426adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev } 465ff09ef8f18eed29bce50c7817df2fd52d2b50cf6Wu-cheng Li __this->mDataCb(msg_type, mem->mBuffers[index], metadata, __this->mCbUser); 4668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static void __data_cb_timestamp(nsecs_t timestamp, int32_t msg_type, 46926adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev const camera_memory_t *data, unsigned index, 4708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user) 4718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 4723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s", __FUNCTION__); 4738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 4748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static_cast<CameraHardwareInterface *>(user); 4758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // Start refcounting the heap object from here on. When the clients 4768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // drop all references, it will be destroyed (as well as the enclosed 4778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // MemoryHeapBase. 4788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(data->handle)); 47926adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev if (index >= mem->mNumBufs) { 48029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__, 48126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev index, mem->mNumBufs); 48226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev return; 48326adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev } 48426adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev __this->mDataCbTimestamp(timestamp, msg_type, mem->mBuffers[index], __this->mCbUser); 4858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 4868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 4878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // This is a utility class that combines a MemoryHeapBase and a MemoryBase 4888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // in one. Since we tend to use them in a one-to-one relationship, this is 4898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev // handy. 4908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 49126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev class CameraHeapMemory : public RefBase { 4928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev public: 49326adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev CameraHeapMemory(int fd, size_t buf_size, uint_t num_buffers = 1) : 49426adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mBufSize(buf_size), 49526adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mNumBufs(num_buffers) 49626adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev { 49726adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mHeap = new MemoryHeapBase(fd, buf_size * num_buffers); 49826adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev commonInitialization(); 49926adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev } 50026adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 50126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev CameraHeapMemory(size_t buf_size, uint_t num_buffers = 1) : 50226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mBufSize(buf_size), 50326adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mNumBufs(num_buffers) 5048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 50526adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mHeap = new MemoryHeapBase(buf_size * num_buffers); 50626adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev commonInitialization(); 50726adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev } 50826adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 50926adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev void commonInitialization() 51026adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev { 51126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev handle.data = mHeap->base(); 51226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev handle.size = mBufSize * mNumBufs; 5138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev handle.handle = this; 51426adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 51526adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mBuffers = new sp<MemoryBase>[mNumBufs]; 51626adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev for (uint_t i = 0; i < mNumBufs; i++) 51726adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mBuffers[i] = new MemoryBase(mHeap, 51826adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev i * mBufSize, 51926adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mBufSize); 52026adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 52126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev handle.release = __put_memory; 5228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 52426adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev virtual ~CameraHeapMemory() 52526adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev { 52626adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev delete [] mBuffers; 52726adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev } 52826adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 52926adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev size_t mBufSize; 53026adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev uint_t mNumBufs; 53126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev sp<MemoryHeapBase> mHeap; 53226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev sp<MemoryBase> *mBuffers; 53326adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 5348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev camera_memory_t handle; 5358951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev }; 5368951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 53726adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev static camera_memory_t* __get_memory(int fd, size_t buf_size, uint_t num_bufs, 53826adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev void *user __attribute__((unused))) 5398951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 54026adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev CameraHeapMemory *mem; 54126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev if (fd < 0) 54226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mem = new CameraHeapMemory(buf_size, num_bufs); 54326adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev else 54426adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mem = new CameraHeapMemory(fd, buf_size, num_bufs); 54526adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mem->incStrong(mem); 5468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return &mem->handle; 5478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 54926adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev static void __put_memory(camera_memory_t *data) 55026adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev { 55126adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev if (!data) 55226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev return; 55326adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 55426adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev CameraHeapMemory *mem = static_cast<CameraHeapMemory *>(data->handle); 55526adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev mem->decStrong(mem); 55626adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev } 55726adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev 5588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static ANativeWindow *__to_anw(void *user) 5598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev CameraHardwareInterface *__this = 5618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev reinterpret_cast<CameraHardwareInterface *>(user); 5628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return __this->mPreviewWindow.get(); 5638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5648951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#define anw(n) __to_anw(((struct camera_preview_window *)n)->user) 5658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __dequeue_buffer(struct preview_stream_ops* w, 567afcedc9e6f17d8213d9bd8f6c36643dcc816d0efIliyan Malchev buffer_handle_t** buffer, int *stride) 5688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int rc; 5708951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5718ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer* anb; 5721e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis rc = native_window_dequeue_buffer_and_wait(a, &anb); 5738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev if (!rc) { 5741e06f435434681f8750cc21763868fd025e8480eSundar Raman *buffer = &anb->handle; 5751e06f435434681f8750cc21763868fd025e8480eSundar Raman *stride = anb->stride; 5768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return rc; 5788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 5798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#ifndef container_of 5818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#define container_of(ptr, type, member) ({ \ 5828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const typeof(((type *) 0)->member) *__mptr = (ptr); \ 5838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev (type *) ((char *) __mptr - (char *)(&((type *)0)->member)); }) 5848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#endif 5858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 5861e06f435434681f8750cc21763868fd025e8480eSundar Raman static int __lock_buffer(struct preview_stream_ops* w, 5871e06f435434681f8750cc21763868fd025e8480eSundar Raman buffer_handle_t* buffer) 5881e06f435434681f8750cc21763868fd025e8480eSundar Raman { 5891e06f435434681f8750cc21763868fd025e8480eSundar Raman ANativeWindow *a = anw(w); 5901e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis return 0; 5911e06f435434681f8750cc21763868fd025e8480eSundar Raman } 5921e06f435434681f8750cc21763868fd025e8480eSundar Raman 5938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __enqueue_buffer(struct preview_stream_ops* w, 5948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev buffer_handle_t* buffer) 5958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 5968951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 5978951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->queueBuffer(a, 5981e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 5998951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6008951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6018951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __cancel_buffer(struct preview_stream_ops* w, 6028951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev buffer_handle_t* buffer) 6038951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6048951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 6058951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->cancelBuffer(a, 6061e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis container_of(buffer, ANativeWindowBuffer, handle), -1); 6078951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6088951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6098951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_buffer_count(struct preview_stream_ops* w, int count) 6108951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6118951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 61226adde897188059057b3ffcfde1d60171fc6888cIliyan Malchev return native_window_set_buffer_count(a, count); 6138951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6148951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6158951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_buffers_geometry(struct preview_stream_ops* w, 6168951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int width, int height, int format) 6178951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6188951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 6198ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev return native_window_set_buffers_geometry(a, 6208951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev width, height, format); 6218951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6228951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6238951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_crop(struct preview_stream_ops *w, 6248951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int left, int top, int right, int bottom) 6258951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6268951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 6278951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev android_native_rect_t crop; 6288951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.left = left; 6298951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.top = top; 6308951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.right = right; 6318951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev crop.bottom = bottom; 6328ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev return native_window_set_crop(a, &crop); 6338951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6348951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6359f3d5919b45c360f88510f7455279aebe810d56bEino-Ville Talvala static int __set_timestamp(struct preview_stream_ops *w, 6369f3d5919b45c360f88510f7455279aebe810d56bEino-Ville Talvala int64_t timestamp) { 6379f3d5919b45c360f88510f7455279aebe810d56bEino-Ville Talvala ANativeWindow *a = anw(w); 6389f3d5919b45c360f88510f7455279aebe810d56bEino-Ville Talvala return native_window_set_buffers_timestamp(a, timestamp); 6399f3d5919b45c360f88510f7455279aebe810d56bEino-Ville Talvala } 6409f3d5919b45c360f88510f7455279aebe810d56bEino-Ville Talvala 6418951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_usage(struct preview_stream_ops* w, int usage) 6428951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6438951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 6448ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev return native_window_set_usage(a, usage); 6458951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6468951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6478951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __set_swap_interval(struct preview_stream_ops *w, int interval) 6488951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6498951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 6508951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->setSwapInterval(a, interval); 6518951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6528951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6538951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev static int __get_min_undequeued_buffer_count( 6548951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev const struct preview_stream_ops *w, 6558951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev int *count) 6568951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6578951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev ANativeWindow *a = anw(w); 6588951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev return a->query(a, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, count); 6598951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6608951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6618951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void initHalPreviewWindow() 6628951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev { 6638951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.cancel_buffer = __cancel_buffer; 6641e06f435434681f8750cc21763868fd025e8480eSundar Raman mHalPreviewWindow.nw.lock_buffer = __lock_buffer; 6658951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.dequeue_buffer = __dequeue_buffer; 6668951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.enqueue_buffer = __enqueue_buffer; 6678951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_buffer_count = __set_buffer_count; 6688951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_buffers_geometry = __set_buffers_geometry; 6698951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_crop = __set_crop; 6709f3d5919b45c360f88510f7455279aebe810d56bEino-Ville Talvala mHalPreviewWindow.nw.set_timestamp = __set_timestamp; 6718951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_usage = __set_usage; 6728951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.set_swap_interval = __set_swap_interval; 6738951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6748951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev mHalPreviewWindow.nw.get_min_undequeued_buffer_count = 6758951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev __get_min_undequeued_buffer_count; 6768951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev } 6778951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6788951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev sp<ANativeWindow> mPreviewWindow; 6798951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6808951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev struct camera_preview_window { 6818951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev struct preview_stream_ops nw; 6828951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *user; 6838951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev }; 6848951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6858951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev struct camera_preview_window mHalPreviewWindow; 6868951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6878951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev notify_callback mNotifyCb; 6888951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback mDataCb; 6898951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev data_callback_timestamp mDataCbTimestamp; 6908951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev void *mCbUser; 6918951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev}; 6928951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6938951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev}; // namespace android 6948951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev 6958951a97b1f8462c37e740ea5082eea0445d2c501Iliyan Malchev#endif 696