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