C++程序  |  306行  |  10.62 KB

/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA2_H
#define HW_EMULATOR_CAMERA_EMULATED_CAMERA2_H

/*
 * Contains declaration of a class EmulatedCamera that encapsulates
 * functionality common to all version 2.0 emulated camera devices.  Instances
 * of this class (for each emulated camera) are created during the construction
 * of the EmulatedCameraFactory instance.  This class serves as an entry point
 * for all camera API calls that defined by camera2_device_ops_t API.
 */

#include "hardware/camera2.h"
#include "system/camera_metadata.h"
#include "EmulatedBaseCamera.h"

namespace android {

/* Encapsulates functionality common to all version 2.0 emulated camera devices
 *
 * Note that EmulatedCameraFactory instantiates object of this class just once,
 * when EmulatedCameraFactory instance gets constructed. Connection to /
 * disconnection from the actual camera device is handled by calls to
 * connectDevice(), and closeCamera() methods of this class that are invoked in
 * response to hw_module_methods_t::open, and camera_device::close callbacks.
 */
class EmulatedCamera2 : public camera2_device, public EmulatedBaseCamera {
public:
    /* Constructs EmulatedCamera2 instance.
     * Param:
     *  cameraId - Zero based camera identifier, which is an index of the camera
     *      instance in camera factory's array.
     *  module - Emulated camera HAL module descriptor.
     */
    EmulatedCamera2(int cameraId,
            struct hw_module_t* module);

    /* Destructs EmulatedCamera2 instance. */
    virtual ~EmulatedCamera2();

    /****************************************************************************
     * Abstract API
     ***************************************************************************/

public:

    /****************************************************************************
     * Public API
     ***************************************************************************/

public:
    virtual status_t Initialize();

    /****************************************************************************
     * Camera API implementation
     ***************************************************************************/

public:
    virtual status_t connectCamera(hw_device_t** device);

    virtual status_t closeCamera();

    virtual status_t getCameraInfo(struct camera_info* info);

    /****************************************************************************
     * Camera API implementation.
     * These methods are called from the camera API callback routines.
     ***************************************************************************/

protected:
    /** Request input queue */

    int setRequestQueueSrcOps(
        camera2_metadata_queue_src_ops *request_queue_src_ops);

    int requestQueueNotifyNotEmpty();

    /** Reprocessing input queue */

    int setReprocessQueueSrcOps(
        camera2_metadata_queue_src_ops *reprocess_queue_src_ops);

    int reprocessQueueNotifyNotEmpty();

    /** Frame output queue */

    int setFrameQueueDstOps(camera2_metadata_queue_dst_ops *frame_queue_dst_ops);

    int frameQueueBufferCount();
    int frameQueueDequeue(camera_metadata_t **buffer);
    int frameQueueFree(camera_metadata_t *old_buffer);

    /** Notifications to application */
    int setNotifyCallback(camera2_notify_callback notify_cb);

    /** Count of requests in flight */
    int getInProgressCount();

    /** Cancel all captures in flight */
    int flushCapturesInProgress();

    /** Reprocessing input stream management */
    int reprocessStreamDequeueBuffer(buffer_handle_t** buffer,
            int *stride);

    int reprocessStreamEnqueueBuffer(buffer_handle_t* buffer);

    int reprocessStreamCancelBuffer(buffer_handle_t* buffer);

    int reprocessStreamSetBufferCount(int count);

    int reprocessStreamSetCrop(int left, int top, int right, int bottom);

    int reprocessStreamSetTimestamp(int64_t timestamp);

    int reprocessStreamSetUsage(int usage);

    int reprocessStreamSetSwapInterval(int interval);

    int reprocessStreamGetMinUndequeuedBufferCount(int *count);

    int reprocessStreamLockBuffer(buffer_handle_t *buffer);

    /** Output stream creation and management */

    int getStreamSlotCount();

    int allocateStream(uint32_t stream_slot,
            uint32_t width,
            uint32_t height,
            int format,
            camera2_stream_ops_t *stream_ops);

    int releaseStream(uint32_t stream_slot);

    /** Custom tag definitions */
    const char* getVendorSectionName(uint32_t tag);
    const char* getVendorTagName(uint32_t tag);
    int         getVendorTagType(uint32_t tag);

    /** Shutdown and debug methods */

    int release();

    int dump(int fd);

    int close();

    /****************************************************************************
     * Camera API callbacks as defined by camera2_device_ops structure.  See
     * hardware/libhardware/include/hardware/camera2.h for information on each
     * of these callbacks. Implemented in this class, these callbacks simply
     * dispatch the call into an instance of EmulatedCamera2 class defined in the
     * 'camera_device2' parameter.
     ***************************************************************************/

private:
    /** Input request queue */
    static int set_request_queue_src_ops(camera2_device_t *,
            camera2_metadata_queue_src_ops *queue_src_ops);
    static int get_request_queue_dst_ops(camera2_device_t *,
            camera2_metadata_queue_dst_ops **queue_dst_ops);
    // for get_request_queue_dst_ops
    static int request_queue_notify_queue_not_empty(
        camera2_metadata_queue_dst_ops *);

    /** Input reprocess queue */
    static int set_reprocess_queue_src_ops(camera2_device_t *,
            camera2_metadata_queue_src_ops *reprocess_queue_src_ops);
    static int get_reprocess_queue_dst_ops(camera2_device_t *,
            camera2_metadata_queue_dst_ops **queue_dst_ops);
    // for reprocess_queue_dst_ops
    static int reprocess_queue_notify_queue_not_empty(
            camera2_metadata_queue_dst_ops *);

    /** Output frame queue */
    static int set_frame_queue_dst_ops(camera2_device_t *,
            camera2_metadata_queue_dst_ops *queue_dst_ops);
    static int get_frame_queue_src_ops(camera2_device_t *,
            camera2_metadata_queue_src_ops **queue_src_ops);
    // for get_frame_queue_src_ops
    static int frame_queue_buffer_count(camera2_metadata_queue_src_ops *);
    static int frame_queue_dequeue(camera2_metadata_queue_src_ops *,
            camera_metadata_t **buffer);
    static int frame_queue_free(camera2_metadata_queue_src_ops *,
            camera_metadata_t *old_buffer);

    /** Notifications to application */
    static int set_notify_callback(camera2_device_t *,
            camera2_notify_callback notify_cb);

    /** In-progress request management */
    static int get_in_progress_count(camera2_device_t *);

    static int flush_captures_in_progress(camera2_device_t *);

    /** Input reprocessing stream */
    static int get_reprocess_stream_ops(camera2_device_t *,
            camera2_stream_ops_t **stream);
    // for get_reprocess_stream_ops
    static int reprocess_stream_dequeue_buffer(camera2_stream_ops *,
            buffer_handle_t** buffer, int *stride);
    static int reprocess_stream_enqueue_buffer(camera2_stream_ops *,
            buffer_handle_t* buffer);
    static int reprocess_stream_cancel_buffer(camera2_stream_ops *,
            buffer_handle_t* buffer);
    static int reprocess_stream_set_buffer_count(camera2_stream_ops *,
            int count);
    static int reprocess_stream_set_crop(camera2_stream_ops *,
            int left, int top, int right, int bottom);
    static int reprocess_stream_set_timestamp(camera2_stream_ops *,
            int64_t timestamp);
    static int reprocess_stream_set_usage(camera2_stream_ops *,
            int usage);
    static int reprocess_stream_set_swap_interval(camera2_stream_ops *,
            int interval);
    static int reprocess_stream_get_min_undequeued_buffer_count(
            const camera2_stream_ops *,
            int *count);
    static int reprocess_stream_lock_buffer(camera2_stream_ops *,
            buffer_handle_t* buffer);

    /** Output stream allocation and management */

    static int get_stream_slot_count(camera2_device_t *);

    static int allocate_stream(camera2_device_t *,
            uint32_t stream_slot,
            uint32_t width,
            uint32_t height,
            uint32_t format,
            camera2_stream_ops_t *stream_ops);

    static int release_stream(camera2_device_t *,
            uint32_t stream_slot);

    static void release(camera2_device_t *);

    /** Vendor metadata registration */

    static int get_metadata_vendor_tag_ops(camera2_device_t *,
            vendor_tag_query_ops_t **ops);
    // for get_metadata_vendor_tag_ops
    static const char* get_camera_vendor_section_name(
            const vendor_tag_query_ops_t *,
            uint32_t tag);
    static const char* get_camera_vendor_tag_name(
            const vendor_tag_query_ops_t *,
            uint32_t tag);
    static int get_camera_vendor_tag_type(
            const vendor_tag_query_ops_t *,
            uint32_t tag);

    static int dump(camera2_device_t *, int fd);

    static int close(struct hw_device_t* device);

    /****************************************************************************
     * Data members
     ***************************************************************************/

  private:
    static camera2_device_ops_t sDeviceOps;

    struct QueueDstOps : public camera2_metadata_queue_dst_ops {
        EmulatedCamera2 *parent;
    };

    struct QueueSrcOps : public camera2_metadata_queue_src_ops {
        EmulatedCamera2 *parent;
    };

    struct StreamOps : public camera2_stream_ops {
        EmulatedCamera2 *parent;
    };

    struct TagOps : public vendor_tag_query_ops {
        EmulatedCamera2 *parent;
    };

    QueueDstOps mRequestQueueDstOps;
    QueueDstOps mReprocessQueueDstOps;
    QueueSrcOps mFrameQueueSrcOps;
    StreamOps   mReprocessStreamOps;
    TagOps      mVendorTagOps;
};

}; /* namespace android */

#endif  /* HW_EMULATOR_CAMERA_EMULATED_CAMERA2_H */