Program kamera kontrol parametreleri

Önceki Genişletilmiş Görüntü Sistemi (EVS) 1.0 sürümünde kamera cihazları salt okunur cihaz olarak kabul edildiğinden, uygulamanın yakınlaştırma veya parlaklık gibi kamera kontrol parametrelerini değiştirmesini sağlayacak bir yöntem yoktu.

Bu durum, EVS uygulamalarının kapasitesini kısıtlayabileceğinden yeni EVS 1.1, yeni yöntemler sunar ve uygulamanın enum CameraParam içinde tanımlanan çeşitli kamera kontrol parametrelerini programlamasını sağlar:

/**
 * 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,
};

Yöntemler şu şekilde tanımlanır:

/**
 * 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. When it becomes a master, it can
 * 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(), istemcinin okuyup yazabileceği parametrelerin listesini (CameraParam enum) döndürür (istemci ana istemciyse) ve getIntParameterRange() geçerli değer aralığını ve çözünürlüğü iletir. Ana müşteri bir kamera parametresini değiştirdiğinde, aynı kamera donanımındaki diğer tüm müşteriler, parametre kimliği ve yeni değer içeren bir PARAMETER_CHANGED etkinliği alarak bilgilendirilir.

Not: Sensör sürücüsü, geçersiz parametre değerlerini farklı şekilde işleyebilir. Yalnızca bir hata kodu döndürebilir veya değeri geçerli aralıktaki değerlerle sınırlayıp uygulayabilir. Bu nedenle, setIntParameter() yöntemi etkili bir değer döndürür ve istemci, isteğin nasıl ele alındığını onaylamak için bu değeri kullanabilir.

Birden fazla kamera istemcisi arasında arabuluculuk isteğinde bulunma

Önceki EVS tasarımı, birden fazla uygulamanın tek bir kamera donanımına aynı anda abone olmasına izin verdiğinden, bir uygulamanın kamera parametresini değiştirerek diğer uygulamaların çalışmasını engellemesi mümkündür. Ayrıca, birden fazla istemci aynı parametreyi farklı şekilde ayarlamak isteyebilir ve bu da çalışan kamera hizmetlerinde beklenmedik davranışlara neden olabilir.

Bu tür sorunları önlemek için EVS yöneticisi, yalnızca ana istemcinin kamera parametresini programlamasına izin verir. İstemci, kamera parametrelerini ayarlamayı denemeden önce setMaster() yöntemini çağırarak ana istemci OLMALIDIR. Bu işlem başarısız olursa söz konusu kamera donanımında zaten etkin bir ana istemci bulunduğu anlamına gelir. Mevcut ana istemci sonlandırılana veya unsetMaster() aracılığıyla ana rolden açıkça vazgeçene kadar başka hiçbir istemcinin kamera parametresini değiştirmesine izin verilmez. Bir ana istemci ayrıcalığını iade ettiğinde diğer tüm uygulamalar bir MASTER_RELEASED etkinliğiyle bilgilendirilir.

Yüksek önceliğe sahip müşteriler

EVS yöneticisi, ekranın sahibi olan istemciyi yüksek öncelikli olarak yönetir ve mevcut bir ana cihazdan ana cihaz rolünü çalmasına izin verir. EVS görüntü sahibiliği yakınlığa dayalı olduğundan yeni istemci, ekranı mevcut istemciden bile devralabilir.

Yüksek öncelikli istemciler, ana rol elde etmek için IEvsCamera::forceMaster(sp<IEvsDisplay>& display) işlevini çağırmalıdır. EVS yöneticisi, belirli bir görüntüleme mülkünün durumunu inceler ve durumu geçerliyse (ve yalnızca geçerliyse) ve DisplayState::NOT_OPEN veya DisplayState::DEAD bir ana öğeyi değiştirmiyorsa öğeyi kullanır. Ana rolü kaybeden istemci, bir MASTER_RELEASED etkinliğiyle bilgilendirilir ve bu durumu DOĞRU şekilde ele ALMALIDIR.