Home | History | Annotate | Download | only in device1
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_HARDWARE_CAMERA_HARDWARE_INTERFACE_H
     18 #define ANDROID_HARDWARE_CAMERA_HARDWARE_INTERFACE_H
     19 
     20 #include <unordered_map>
     21 #include <binder/IMemory.h>
     22 #include <binder/MemoryBase.h>
     23 #include <binder/MemoryHeapBase.h>
     24 #include <utils/RefBase.h>
     25 #include <ui/GraphicBuffer.h>
     26 #include <camera/Camera.h>
     27 #include <camera/CameraParameters.h>
     28 #include <system/window.h>
     29 #include <hardware/camera.h>
     30 
     31 #include <common/CameraProviderManager.h>
     32 
     33 namespace android {
     34 
     35 typedef void (*notify_callback)(int32_t msgType,
     36                             int32_t ext1,
     37                             int32_t ext2,
     38                             void* user);
     39 
     40 typedef void (*data_callback)(int32_t msgType,
     41                             const sp<IMemory> &dataPtr,
     42                             camera_frame_metadata_t *metadata,
     43                             void* user);
     44 
     45 typedef void (*data_callback_timestamp)(nsecs_t timestamp,
     46                             int32_t msgType,
     47                             const sp<IMemory> &dataPtr,
     48                             void *user);
     49 
     50 struct HandleTimestampMessage {
     51     nsecs_t timestamp;
     52     const sp<IMemory> dataPtr;
     53 };
     54 
     55 typedef void (*data_callback_timestamp_batch)(
     56         int32_t msgType,
     57         const std::vector<HandleTimestampMessage>&, void* user);
     58 
     59 /**
     60  * CameraHardwareInterface.h defines the interface to the
     61  * camera hardware abstraction layer, used for setting and getting
     62  * parameters, live previewing, and taking pictures. It is used for
     63  * HAL devices with version CAMERA_DEVICE_API_VERSION_1_0 only.
     64  *
     65  * It is a referenced counted interface with RefBase as its base class.
     66  * CameraService calls openCameraHardware() to retrieve a strong pointer to the
     67  * instance of this interface and may be called multiple times. The
     68  * following steps describe a typical sequence:
     69  *
     70  *   -# After CameraService calls openCameraHardware(), getParameters() and
     71  *      setParameters() are used to initialize the camera instance.
     72  *   -# startPreview() is called.
     73  *
     74  * Prior to taking a picture, CameraService often calls autofocus(). When auto
     75  * focusing has completed, the camera instance sends a CAMERA_MSG_FOCUS notification,
     76  * which informs the application whether focusing was successful. The camera instance
     77  * only sends this message once and it is up  to the application to call autoFocus()
     78  * again if refocusing is desired.
     79  *
     80  * CameraService calls takePicture() to request the camera instance take a
     81  * picture. At this point, if a shutter, postview, raw, and/or compressed
     82  * callback is desired, the corresponding message must be enabled. Any memory
     83  * provided in a data callback must be copied if it's needed after returning.
     84  */
     85 
     86 class CameraHardwareInterface :
     87         public virtual RefBase,
     88         public virtual hardware::camera::device::V1_0::ICameraDeviceCallback,
     89         public virtual hardware::camera::device::V1_0::ICameraDevicePreviewCallback {
     90 
     91 public:
     92     explicit CameraHardwareInterface(const char *name):
     93             mHidlDevice(nullptr),
     94             mName(name),
     95             mPreviewScalingMode(NOT_SET),
     96             mPreviewTransform(NOT_SET),
     97             mPreviewWidth(NOT_SET),
     98             mPreviewHeight(NOT_SET),
     99             mPreviewFormat(NOT_SET),
    100             mPreviewUsage(0),
    101             mPreviewSwapInterval(NOT_SET),
    102             mPreviewCrop{NOT_SET,NOT_SET,NOT_SET,NOT_SET}
    103     {
    104     }
    105 
    106     ~CameraHardwareInterface();
    107 
    108     status_t initialize(sp<CameraProviderManager> manager);
    109 
    110     /** Set the ANativeWindow to which preview frames are sent */
    111     status_t setPreviewWindow(const sp<ANativeWindow>& buf);
    112 
    113     status_t setPreviewScalingMode(int scalingMode);
    114 
    115     status_t setPreviewTransform(int transform);
    116 
    117     /** Set the notification and data callbacks */
    118     void setCallbacks(notify_callback notify_cb,
    119                       data_callback data_cb,
    120                       data_callback_timestamp data_cb_timestamp,
    121                       data_callback_timestamp_batch data_cb_timestamp_batch,
    122                       void* user);
    123 
    124     /**
    125      * The following three functions all take a msgtype,
    126      * which is a bitmask of the messages defined in
    127      * include/ui/Camera.h
    128      */
    129 
    130     /**
    131      * Enable a message, or set of messages.
    132      */
    133     void enableMsgType(int32_t msgType);
    134 
    135     /**
    136      * Disable a message, or a set of messages.
    137      *
    138      * Once received a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), camera hal
    139      * should not rely on its client to call releaseRecordingFrame() to release
    140      * video recording frames sent out by the cameral hal before and after the
    141      * disableMsgType(CAMERA_MSG_VIDEO_FRAME) call. Camera hal clients must not
    142      * modify/access any video recording frame after calling
    143      * disableMsgType(CAMERA_MSG_VIDEO_FRAME).
    144      */
    145     void disableMsgType(int32_t msgType);
    146 
    147     /**
    148      * Query whether a message, or a set of messages, is enabled.
    149      * Note that this is operates as an AND, if any of the messages
    150      * queried are off, this will return false.
    151      */
    152     int msgTypeEnabled(int32_t msgType);
    153 
    154     /**
    155      * Start preview mode.
    156      */
    157     status_t startPreview();
    158 
    159     /**
    160      * Stop a previously started preview.
    161      */
    162     void stopPreview();
    163 
    164     /**
    165      * Returns true if preview is enabled.
    166      */
    167     int previewEnabled();
    168 
    169     /**
    170      * Request the camera hal to store meta data or real YUV data in
    171      * the video buffers send out via CAMERA_MSG_VIDEO_FRRAME for a
    172      * recording session. If it is not called, the default camera
    173      * hal behavior is to store real YUV data in the video buffers.
    174      *
    175      * This method should be called before startRecording() in order
    176      * to be effective.
    177      *
    178      * If meta data is stored in the video buffers, it is up to the
    179      * receiver of the video buffers to interpret the contents and
    180      * to find the actual frame data with the help of the meta data
    181      * in the buffer. How this is done is outside of the scope of
    182      * this method.
    183      *
    184      * Some camera hal may not support storing meta data in the video
    185      * buffers, but all camera hal should support storing real YUV data
    186      * in the video buffers. If the camera hal does not support storing
    187      * the meta data in the video buffers when it is requested to do
    188      * do, INVALID_OPERATION must be returned. It is very useful for
    189      * the camera hal to pass meta data rather than the actual frame
    190      * data directly to the video encoder, since the amount of the
    191      * uncompressed frame data can be very large if video size is large.
    192      *
    193      * @param enable if true to instruct the camera hal to store
    194      *      meta data in the video buffers; false to instruct
    195      *      the camera hal to store real YUV data in the video
    196      *      buffers.
    197      *
    198      * @return OK on success.
    199      */
    200 
    201     status_t storeMetaDataInBuffers(int enable);
    202 
    203     /**
    204      * Start record mode. When a record image is available a CAMERA_MSG_VIDEO_FRAME
    205      * message is sent with the corresponding frame. Every record frame must be released
    206      * by a cameral hal client via releaseRecordingFrame() before the client calls
    207      * disableMsgType(CAMERA_MSG_VIDEO_FRAME). After the client calls
    208      * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is camera hal's responsibility
    209      * to manage the life-cycle of the video recording frames, and the client must
    210      * not modify/access any video recording frames.
    211      */
    212     status_t startRecording();
    213 
    214     /**
    215      * Stop a previously started recording.
    216      */
    217     void stopRecording();
    218 
    219     /**
    220      * Returns true if recording is enabled.
    221      */
    222     int recordingEnabled();
    223 
    224     /**
    225      * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
    226      *
    227      * It is camera hal client's responsibility to release video recording
    228      * frames sent out by the camera hal before the camera hal receives
    229      * a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME). After it receives
    230      * the call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is camera hal's
    231      * responsibility of managing the life-cycle of the video recording
    232      * frames.
    233      */
    234     void releaseRecordingFrame(const sp<IMemory>& mem);
    235 
    236     /**
    237      * Release a batch of recording frames previously returned by
    238      * CAMERA_MSG_VIDEO_FRAME. This method only supports frames that are
    239      * stored as VideoNativeHandleMetadata.
    240      *
    241      * It is camera hal client's responsibility to release video recording
    242      * frames sent out by the camera hal before the camera hal receives
    243      * a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME). After it receives
    244      * the call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is camera hal's
    245      * responsibility of managing the life-cycle of the video recording
    246      * frames.
    247      */
    248     void releaseRecordingFrameBatch(const std::vector<sp<IMemory>>& frames);
    249 
    250     /**
    251      * Start auto focus, the notification callback routine is called
    252      * with CAMERA_MSG_FOCUS once when focusing is complete. autoFocus()
    253      * will be called again if another auto focus is needed.
    254      */
    255     status_t autoFocus();
    256 
    257     /**
    258      * Cancels auto-focus function. If the auto-focus is still in progress,
    259      * this function will cancel it. Whether the auto-focus is in progress
    260      * or not, this function will return the focus position to the default.
    261      * If the camera does not support auto-focus, this is a no-op.
    262      */
    263     status_t cancelAutoFocus();
    264 
    265     /**
    266      * Take a picture.
    267      */
    268     status_t takePicture();
    269 
    270     /**
    271      * Cancel a picture that was started with takePicture.  Calling this
    272      * method when no picture is being taken is a no-op.
    273      */
    274     status_t cancelPicture();
    275 
    276     /**
    277      * Set the camera parameters. This returns BAD_VALUE if any parameter is
    278      * invalid or not supported. */
    279     status_t setParameters(const CameraParameters &params);
    280 
    281     /** Return the camera parameters. */
    282     CameraParameters getParameters() const;
    283 
    284     /**
    285      * Send command to camera driver.
    286      */
    287     status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
    288 
    289     /**
    290      * Release the hardware resources owned by this object.  Note that this is
    291      * *not* done in the destructor.
    292      */
    293     void release();
    294 
    295     /**
    296      * Dump state of the camera hardware
    297      */
    298     status_t dump(int fd, const Vector<String16>& /*args*/) const;
    299 
    300 private:
    301     sp<hardware::camera::device::V1_0::ICameraDevice> mHidlDevice;
    302     String8 mName;
    303 
    304     static void sNotifyCb(int32_t msg_type, int32_t ext1,
    305                             int32_t ext2, void *user);
    306 
    307     static void sDataCb(int32_t msg_type,
    308                           const camera_memory_t *data, unsigned int index,
    309                           camera_frame_metadata_t *metadata,
    310                           void *user);
    311 
    312     static void sDataCbTimestamp(nsecs_t timestamp, int32_t msg_type,
    313                              const camera_memory_t *data, unsigned index,
    314                              void *user);
    315 
    316     // This is a utility class that combines a MemoryHeapBase and a MemoryBase
    317     // in one.  Since we tend to use them in a one-to-one relationship, this is
    318     // handy.
    319     class CameraHeapMemory : public RefBase {
    320     public:
    321         CameraHeapMemory(int fd, size_t buf_size, uint_t num_buffers = 1) :
    322                          mBufSize(buf_size),
    323                          mNumBufs(num_buffers)
    324         {
    325             mHeap = new MemoryHeapBase(fd, buf_size * num_buffers);
    326             commonInitialization();
    327         }
    328 
    329         explicit CameraHeapMemory(size_t buf_size, uint_t num_buffers = 1) :
    330                                   mBufSize(buf_size),
    331                                   mNumBufs(num_buffers)
    332         {
    333             mHeap = new MemoryHeapBase(buf_size * num_buffers);
    334             commonInitialization();
    335         }
    336 
    337         void commonInitialization()
    338         {
    339             handle.data = mHeap->base();
    340             handle.size = mBufSize * mNumBufs;
    341             handle.handle = this;
    342 
    343             mBuffers = new sp<MemoryBase>[mNumBufs];
    344             for (uint_t i = 0; i < mNumBufs; i++)
    345                 mBuffers[i] = new MemoryBase(mHeap,
    346                                              i * mBufSize,
    347                                              mBufSize);
    348 
    349             handle.release = sPutMemory;
    350         }
    351 
    352         virtual ~CameraHeapMemory()
    353         {
    354             delete [] mBuffers;
    355         }
    356 
    357         size_t mBufSize;
    358         uint_t mNumBufs;
    359         sp<MemoryHeapBase> mHeap;
    360         sp<MemoryBase> *mBuffers;
    361 
    362         camera_memory_t handle;
    363     };
    364 
    365     static camera_memory_t* sGetMemory(int fd, size_t buf_size, uint_t num_bufs,
    366                                          void *user __attribute__((unused)));
    367 
    368     static void sPutMemory(camera_memory_t *data);
    369 
    370     std::pair<bool, uint64_t> getBufferId(ANativeWindowBuffer* anb);
    371     void cleanupCirculatingBuffers();
    372 
    373     /**
    374      * Implementation of android::hardware::camera::device::V1_0::ICameraDeviceCallback
    375      */
    376     hardware::Return<void> notifyCallback(
    377             hardware::camera::device::V1_0::NotifyCallbackMsg msgType,
    378             int32_t ext1, int32_t ext2) override;
    379     hardware::Return<uint32_t> registerMemory(
    380             const hardware::hidl_handle& descriptor,
    381             uint32_t bufferSize, uint32_t bufferCount) override;
    382     hardware::Return<void> unregisterMemory(uint32_t memId) override;
    383     hardware::Return<void> dataCallback(
    384             hardware::camera::device::V1_0::DataCallbackMsg msgType,
    385             uint32_t data, uint32_t bufferIndex,
    386             const hardware::camera::device::V1_0::CameraFrameMetadata& metadata) override;
    387     hardware::Return<void> dataCallbackTimestamp(
    388             hardware::camera::device::V1_0::DataCallbackMsg msgType,
    389             uint32_t data, uint32_t bufferIndex, int64_t timestamp) override;
    390     hardware::Return<void> handleCallbackTimestamp(
    391             hardware::camera::device::V1_0::DataCallbackMsg msgType,
    392             const hardware::hidl_handle& frameData, uint32_t data,
    393             uint32_t bufferIndex, int64_t timestamp) override;
    394     hardware::Return<void> handleCallbackTimestampBatch(
    395             hardware::camera::device::V1_0::DataCallbackMsg msgType,
    396             const hardware::hidl_vec<
    397                     hardware::camera::device::V1_0::HandleTimestampMessage>&) override;
    398 
    399     /**
    400      * Implementation of android::hardware::camera::device::V1_0::ICameraDevicePreviewCallback
    401      */
    402     hardware::Return<void> dequeueBuffer(dequeueBuffer_cb _hidl_cb) override;
    403     hardware::Return<hardware::camera::common::V1_0::Status>
    404             enqueueBuffer(uint64_t bufferId) override;
    405     hardware::Return<hardware::camera::common::V1_0::Status>
    406             cancelBuffer(uint64_t bufferId) override;
    407     hardware::Return<hardware::camera::common::V1_0::Status>
    408             setBufferCount(uint32_t count) override;
    409     hardware::Return<hardware::camera::common::V1_0::Status>
    410             setBuffersGeometry(uint32_t w, uint32_t h,
    411                     hardware::graphics::common::V1_0::PixelFormat format) override;
    412     hardware::Return<hardware::camera::common::V1_0::Status>
    413             setCrop(int32_t left, int32_t top, int32_t right, int32_t bottom) override;
    414     hardware::Return<hardware::camera::common::V1_0::Status>
    415             setUsage(hardware::graphics::common::V1_0::BufferUsage usage) override;
    416     hardware::Return<hardware::camera::common::V1_0::Status>
    417             setSwapInterval(int32_t interval) override;
    418     hardware::Return<void> getMinUndequeuedBufferCount(
    419         getMinUndequeuedBufferCount_cb _hidl_cb) override;
    420     hardware::Return<hardware::camera::common::V1_0::Status>
    421             setTimestamp(int64_t timestamp) override;
    422 
    423     sp<ANativeWindow>        mPreviewWindow;
    424 
    425     notify_callback               mNotifyCb;
    426     data_callback                 mDataCb;
    427     data_callback_timestamp       mDataCbTimestamp;
    428     data_callback_timestamp_batch mDataCbTimestampBatch;
    429     void *mCbUser;
    430 
    431     // Cached values for preview stream parameters
    432     static const int NOT_SET = -1;
    433     int mPreviewScalingMode;
    434     int mPreviewTransform;
    435     int mPreviewWidth;
    436     int mPreviewHeight;
    437     int mPreviewFormat;
    438     uint64_t mPreviewUsage;
    439     int mPreviewSwapInterval;
    440     android_native_rect_t mPreviewCrop;
    441 
    442     struct BufferHasher {
    443         size_t operator()(const buffer_handle_t& buf) const {
    444             if (buf == nullptr)
    445                 return 0;
    446 
    447             size_t result = 1;
    448             result = 31 * result + buf->numFds;
    449             result = 31 * result + buf->numInts;
    450             int length = buf->numFds + buf->numInts;
    451             for (int i = 0; i < length; i++) {
    452                 result = 31 * result + buf->data[i];
    453             }
    454             return result;
    455         }
    456     };
    457 
    458     struct BufferComparator {
    459         bool operator()(const buffer_handle_t& buf1, const buffer_handle_t& buf2) const {
    460             if (buf1->numFds == buf2->numFds && buf1->numInts == buf2->numInts) {
    461                 int length = buf1->numFds + buf1->numInts;
    462                 for (int i = 0; i < length; i++) {
    463                     if (buf1->data[i] != buf2->data[i]) {
    464                         return false;
    465                     }
    466                 }
    467                 return true;
    468             }
    469             return false;
    470         }
    471     };
    472 
    473     std::mutex mBufferIdMapLock; // protecting mBufferIdMap and mNextBufferId
    474     typedef std::unordered_map<const buffer_handle_t, uint64_t,
    475             BufferHasher, BufferComparator> BufferIdMap;
    476     // stream ID -> per stream buffer ID map
    477     BufferIdMap mBufferIdMap;
    478     std::unordered_map<uint64_t, ANativeWindowBuffer*> mReversedBufMap;
    479     uint64_t mNextBufferId = 1;
    480     static const uint64_t BUFFER_ID_NO_BUFFER = 0;
    481 
    482     std::mutex mHidlMemPoolMapLock; // protecting mHidlMemPoolMap
    483     std::unordered_map<int, camera_memory_t*> mHidlMemPoolMap;
    484 };
    485 
    486 };  // namespace android
    487 
    488 #endif
    489