Parameter Kontrol Kamera Pemrograman, Parameter Kontrol Kamera Pemrograman

Dalam rilis Extended View System (EVS) 1.0 sebelumnya, perangkat kamera dianggap sebagai perangkat hanya-baca dan, oleh karena itu, tidak ada metode yang memungkinkan aplikasi mengubah parameter kontrol kamera seperti zoom atau kecerahan.

Karena hal ini dapat membatasi kemampuan aplikasi EVS, EVS 1.1 yang baru memperkenalkan metode baru dan memungkinkan aplikasi untuk memprogram beberapa parameter kontrol kamera, yang semuanya didefinisikan dalam enum CameraParam :

/**
 * EVS Camera Parameter
 */
enum CameraParam : uint32_t {
    /**
     * The brightness of image frames
     */
    BRIGHTNESS,
    /**
     * The contrast of image frames
     */
    CONTRAST,
    /**
     * Automatic gain/exposure control
     */
    AUTOGAIN,
    /**
     * Gain control
     */
    GAIN,
    /**
     * Automatic Whitebalance
     */
    AUTO_WHITE_BALANCE,
    /**
     * Manual white balance setting as a color temperature in Kelvin.
     */
    WHITE_BALANCE_TEMPERATURE,
    /**
     * Image sharpness adjustment
     */
    SHARPNESS,
    /**
     * Auto Exposure Control modes; auto, manual, shutter priority, or
     * aperture priority.
     */
    AUTO_EXPOSURE,
    /**
     * Manual exposure time of the camera
     */
    ABSOLUTE_EXPOSURE,
    /**
     * Set the focal point of the camera to the specified position. This
     * parameter may not be effective when auto focus is enabled.
     */
    ABSOLUTE_FOCUS,
    /**
     * Enables continuous automatic focus adjustments.
     */
    AUTO_FOCUS,
    /**
     * Specify the objective lens focal length as an absolute value.
     */
    ABSOLUTE_ZOOM,
};

Metode didefinisikan sebagai:

/**
 * Requests to be a master client.
 *
 * When multiple clients subscribe to a single camera hardware and one of
 * them adjusts a camera parameter such as the contrast, it may disturb
 * other clients' operations. Therefore, the client must call this method
 * to be a master client. Once it becomes a master, it will be able to
 * change camera parameters until either it dies or explicitly gives up the
 * role.
 *
 * @return result EvsResult::OK if a master role is granted.
 *                EvsResult::OWNERSHIP_LOST if there is already a
 *                master client.
 */
setMaster() generates (EvsResult result);

/**
 * Sets to be a master client forcibly.
 *
 * The client, which owns the display, has a high priority and can take over
 * a master role from other clients without the display.
 *
 * @param  display IEvsDisplay handle. If this is valid, the calling client
 *                 is considered as the high priority client and therefore
 *                 it would take over a master role.
 *
 * @return result  EvsResult::OK if a master role is granted.
 *                 EvsResult::OWNERSHIP_LOST if there is already a
 *                 master client with the display.
 */
forceMaster(IEvsDisplay display) generates (EvsResult result);

/**
 * Retires from a master client role.
 *
 * @return result EvsResult::OK if this call is successful.
 *                EvsResult::INVALID_ARG if the caller client is not a
 *                master client.
 */
unsetMaster() generates (EvsResult result);

/**
 * Retrieves a list of parameters this camera supports.
 *
 * @return params A list of CameraParam that this camera supports.
 */
getParameterList() generates (vec<CameraParam> params);

/**
 * Requests a valid value range of a camera parameter
 *
 * @param  id    The identifier of camera parameter, CameraParam enum.
 *
 * @return min   The lower bound of the valid parameter value range.
 * @return max   The upper bound of the valid parameter value range.
 * @return step  The resolution of values in valid range.
 */
getIntParameterRange(CameraParam id)
    generates (int32_t min, int32_t max, int32_t step);

/**
 * Requests to set a camera parameter.
 *
 * @param  id             The identifier of camera parameter,
 *                        CameraParam enum.
 *         value          A desired parameter value.
 * @return result         EvsResult::OK if it succeeds to set a parameter.
 *                        EvsResult::INVALID_ARG if either a requested
 *                        parameter is not supported or a given value is out
 *                        of bounds.
 *         effectiveValue A programmed parameter value. This may differ
 *                        from what the client gives if, for example, the
 *                        driver does not support a target parameter.
 */
setIntParameter(CameraParam id, int32_t value)
    generates (EvsResult result, int32_t effectiveValue);

/**
 * Retrieves a value of given camera parameter.
 *
 * @param  id     The identifier of camera parameter, CameraParam enum.
 * @return result EvsResult::OK if it succeeds to read a parameter.
 *                EvsResult::INVALID_ARG if either a requested parameter is
 *                not supported.
 *         value  A value of requested camera parameter.
 */
getIntParameter(CameraParam id) generates(EvsResult result, int32_t value);

getParameterList() mengembalikan daftar parameter ( CameraParam enum) yang dapat dibaca dan ditulis klien (jika klien adalah master), dan getIntParameterRange() menyampaikan rentang nilai dan resolusi yang valid. Saat klien master mengubah parameter kamera, semua klien lain pada perangkat keras kamera yang sama akan diberi tahu dengan mendapatkan peristiwa PARAMETER_CHANGED dengan ID parameter dan nilai baru.

Catatan: Driver sensor mungkin menangani nilai parameter yang tidak valid secara berbeda. Ini mungkin hanya mengembalikan kode kesalahan atau memotong nilai dalam rentang yang valid dan menerapkannya. Oleh karena itu, metode setIntParameter() mengembalikan nilai efektif dan klien dapat menggunakan nilai ini untuk mengonfirmasi bagaimana permintaan ditangani.

Minta Arbitrase Antara Beberapa Klien Kamera

Karena desain EVS sebelumnya memungkinkan beberapa aplikasi untuk secara bersamaan berlangganan ke satu perangkat keras kamera, ada kemungkinan satu aplikasi dapat mengganggu pengoperasian aplikasi lain dengan mengubah parameter kamera. Selain itu, beberapa klien mungkin ingin menyesuaikan parameter yang sama secara berbeda dan dengan demikian menyebabkan perilaku yang tidak diharapkan dalam menjalankan layanan kamera.

Untuk menghindari masalah seperti itu, manajer EVS mengizinkan hanya klien master yang memprogram parameter kamera. Sebelum mencoba menyesuaikan parameter kamera apa pun, klien HARUS menjadi klien master dengan memanggil metode setMaster() . Jika gagal, berarti sudah ada klien master aktif pada perangkat keras kamera tersebut. Sampai klien master saat ini mati, atau secara eksplisit menyerahkan peran master melalui unsetMaster() , klien lain tidak akan diizinkan untuk mengubah parameter kamera. Ketika klien master mengembalikan hak istimewanya, semua aplikasi lain akan diberi tahu oleh acara MASTER_RELEASED .

Klien dengan Prioritas Tinggi

Manajer EVS menangani klien yang memiliki tampilan dengan prioritas tinggi dan memungkinkannya untuk mencuri peran master dari master saat ini. Karena kepemilikan tampilan EVS didasarkan pada kebaruan, klien baru bahkan dapat mengambil alih dari klien saat ini dengan tampilan.

Klien prioritas tinggi harus memanggil IEvsCamera::forceMaster(sp<IEvsDisplay>& display) untuk mendapatkan peran utama. Manajer EVS memeriksa status pegangan tampilan yang diberikan dan, jika ( dan hanya jika ) statusnya valid dan baik DisplayState::NOT_OPEN maupun DisplayState::DEAD tidak menggantikan master. Klien, yang baru saja kehilangan peran master, akan diberi tahu oleh acara MASTER_RELEASED dan HARUS menangani ini dengan benar.

,

Dalam rilis Extended View System (EVS) 1.0 sebelumnya, perangkat kamera dianggap sebagai perangkat hanya-baca dan, oleh karena itu, tidak ada metode yang memungkinkan aplikasi mengubah parameter kontrol kamera seperti zoom atau kecerahan.

Karena hal ini dapat membatasi kemampuan aplikasi EVS, EVS 1.1 yang baru memperkenalkan metode baru dan memungkinkan aplikasi untuk memprogram beberapa parameter kontrol kamera, yang semuanya didefinisikan dalam enum CameraParam :

/**
 * EVS Camera Parameter
 */
enum CameraParam : uint32_t {
    /**
     * The brightness of image frames
     */
    BRIGHTNESS,
    /**
     * The contrast of image frames
     */
    CONTRAST,
    /**
     * Automatic gain/exposure control
     */
    AUTOGAIN,
    /**
     * Gain control
     */
    GAIN,
    /**
     * Automatic Whitebalance
     */
    AUTO_WHITE_BALANCE,
    /**
     * Manual white balance setting as a color temperature in Kelvin.
     */
    WHITE_BALANCE_TEMPERATURE,
    /**
     * Image sharpness adjustment
     */
    SHARPNESS,
    /**
     * Auto Exposure Control modes; auto, manual, shutter priority, or
     * aperture priority.
     */
    AUTO_EXPOSURE,
    /**
     * Manual exposure time of the camera
     */
    ABSOLUTE_EXPOSURE,
    /**
     * Set the focal point of the camera to the specified position. This
     * parameter may not be effective when auto focus is enabled.
     */
    ABSOLUTE_FOCUS,
    /**
     * Enables continuous automatic focus adjustments.
     */
    AUTO_FOCUS,
    /**
     * Specify the objective lens focal length as an absolute value.
     */
    ABSOLUTE_ZOOM,
};

Metode didefinisikan sebagai:

/**
 * Requests to be a master client.
 *
 * When multiple clients subscribe to a single camera hardware and one of
 * them adjusts a camera parameter such as the contrast, it may disturb
 * other clients' operations. Therefore, the client must call this method
 * to be a master client. Once it becomes a master, it will be able to
 * change camera parameters until either it dies or explicitly gives up the
 * role.
 *
 * @return result EvsResult::OK if a master role is granted.
 *                EvsResult::OWNERSHIP_LOST if there is already a
 *                master client.
 */
setMaster() generates (EvsResult result);

/**
 * Sets to be a master client forcibly.
 *
 * The client, which owns the display, has a high priority and can take over
 * a master role from other clients without the display.
 *
 * @param  display IEvsDisplay handle. If this is valid, the calling client
 *                 is considered as the high priority client and therefore
 *                 it would take over a master role.
 *
 * @return result  EvsResult::OK if a master role is granted.
 *                 EvsResult::OWNERSHIP_LOST if there is already a
 *                 master client with the display.
 */
forceMaster(IEvsDisplay display) generates (EvsResult result);

/**
 * Retires from a master client role.
 *
 * @return result EvsResult::OK if this call is successful.
 *                EvsResult::INVALID_ARG if the caller client is not a
 *                master client.
 */
unsetMaster() generates (EvsResult result);

/**
 * Retrieves a list of parameters this camera supports.
 *
 * @return params A list of CameraParam that this camera supports.
 */
getParameterList() generates (vec<CameraParam> params);

/**
 * Requests a valid value range of a camera parameter
 *
 * @param  id    The identifier of camera parameter, CameraParam enum.
 *
 * @return min   The lower bound of the valid parameter value range.
 * @return max   The upper bound of the valid parameter value range.
 * @return step  The resolution of values in valid range.
 */
getIntParameterRange(CameraParam id)
    generates (int32_t min, int32_t max, int32_t step);

/**
 * Requests to set a camera parameter.
 *
 * @param  id             The identifier of camera parameter,
 *                        CameraParam enum.
 *         value          A desired parameter value.
 * @return result         EvsResult::OK if it succeeds to set a parameter.
 *                        EvsResult::INVALID_ARG if either a requested
 *                        parameter is not supported or a given value is out
 *                        of bounds.
 *         effectiveValue A programmed parameter value. This may differ
 *                        from what the client gives if, for example, the
 *                        driver does not support a target parameter.
 */
setIntParameter(CameraParam id, int32_t value)
    generates (EvsResult result, int32_t effectiveValue);

/**
 * Retrieves a value of given camera parameter.
 *
 * @param  id     The identifier of camera parameter, CameraParam enum.
 * @return result EvsResult::OK if it succeeds to read a parameter.
 *                EvsResult::INVALID_ARG if either a requested parameter is
 *                not supported.
 *         value  A value of requested camera parameter.
 */
getIntParameter(CameraParam id) generates(EvsResult result, int32_t value);

getParameterList() mengembalikan daftar parameter ( CameraParam enum) yang dapat dibaca dan ditulis klien (jika klien adalah master), dan getIntParameterRange() menyampaikan rentang nilai dan resolusi yang valid. Saat klien master mengubah parameter kamera, semua klien lain pada perangkat keras kamera yang sama akan diberi tahu dengan mendapatkan peristiwa PARAMETER_CHANGED dengan ID parameter dan nilai baru.

Catatan: Driver sensor mungkin menangani nilai parameter yang tidak valid secara berbeda. Ini mungkin hanya mengembalikan kode kesalahan atau memotong nilai dalam rentang yang valid dan menerapkannya. Oleh karena itu, metode setIntParameter() mengembalikan nilai efektif dan klien dapat menggunakan nilai ini untuk mengonfirmasi bagaimana permintaan ditangani.

Minta Arbitrase Antara Beberapa Klien Kamera

Karena desain EVS sebelumnya memungkinkan beberapa aplikasi untuk secara bersamaan berlangganan ke satu perangkat keras kamera, ada kemungkinan satu aplikasi dapat mengganggu pengoperasian aplikasi lain dengan mengubah parameter kamera. Selain itu, beberapa klien mungkin ingin menyesuaikan parameter yang sama secara berbeda dan dengan demikian menyebabkan perilaku yang tidak diharapkan dalam menjalankan layanan kamera.

Untuk menghindari masalah seperti itu, manajer EVS mengizinkan hanya klien master yang memprogram parameter kamera. Sebelum mencoba menyesuaikan parameter kamera apa pun, klien HARUS menjadi klien master dengan memanggil metode setMaster() . Jika gagal, berarti sudah ada klien master aktif pada perangkat keras kamera tersebut. Sampai klien master saat ini mati, atau secara eksplisit menyerahkan peran master melalui unsetMaster() , klien lain tidak akan diizinkan untuk mengubah parameter kamera. Ketika klien master mengembalikan hak istimewanya, semua aplikasi lain akan diberi tahu oleh acara MASTER_RELEASED .

Klien dengan Prioritas Tinggi

Manajer EVS menangani klien yang memiliki tampilan dengan prioritas tinggi dan memungkinkannya untuk mencuri peran master dari master saat ini. Karena kepemilikan tampilan EVS didasarkan pada kebaruan, klien baru bahkan dapat mengambil alih dari klien saat ini dengan tampilan.

Klien prioritas tinggi harus memanggil IEvsCamera::forceMaster(sp<IEvsDisplay>& display) untuk mendapatkan peran utama. Manajer EVS memeriksa status pegangan tampilan yang diberikan dan, jika ( dan hanya jika ) statusnya valid dan baik DisplayState::NOT_OPEN maupun DisplayState::DEAD tidak menggantikan master. Klien, yang baru saja kehilangan peran master, akan diberi tahu oleh acara MASTER_RELEASED dan HARUS menangani ini dengan benar.