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 &params)
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