פרמטרים של בקרת מצלמה בתוכנית

בגרסה הקודמת של מערכת התצוגה המורחבת (EVS) 1.0, מכשירים עם מצלמה נחשבים למכשירים לקריאה בלבד, ולכן לא הייתה שיטה שמאפשרת לאפליקציה לשנות את הפרמטרים של אמצעי הבקרה של המצלמה, כמו זום או בהירות.

מכיוון שהדבר עלול להגביל את היכולות של אפליקציות EVS, בגרסה החדשה EVS 1.1 נוספו שיטות חדשות שמאפשרות לאפליקציה לתכנת כמה פרמטרים של בקרת מצלמה, שכולם מוגדרים ב-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,
};

השיטות מוגדרות כך:

/**
 * 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() מחזירה רשימה של פרמטרים (CameraParam enum) שהלקוח יכול לקרוא ולכתוב (אם הלקוח הוא מאסטר), והפונקציה getIntParameterRange() מעבירה את טווח הערכים התקף ואת הרזולוציה. כשלקוח מאסטר משנה פרמטר של מצלמה, כל שאר הלקוחות באותה חומרת מצלמה מקבלים הודעה על כך באמצעות אירוע PARAMETER_CHANGED עם מזהה פרמטר וערך חדש.

הערה: יכול להיות שמנהל החיישן יטפל בערכים לא חוקיים של פרמטרים באופן שונה. יכול להיות שהיא פשוט תחזיר קוד שגיאה או תקצץ את הערך לטווח החוקי ותחיל אותו. לכן, השיטה setIntParameter() מחזירה ערך יעיל, והלקוח יכול להשתמש בערך הזה כדי לאשר איך הבקשה טופלה.

בקשה לבוררות בין מספר לקוחות מצלמה

מכיוון שהעיצוב הקודם של EVS איפשר לכמה אפליקציות להירשם בו-זמנית לחומרה של מצלמה אחת, יכול להיות שאפליקציה אחת תוכל לשבש את הפעולות של אפליקציות אחרות על ידי שינוי פרמטר של המצלמה. בנוסף, יכול להיות שמספר לקוחות ירצו לשנות את אותו פרמטר באופן שונה, וכתוצאה מכך התנהגות בלתי צפויה בשירותי המצלמה שפועלים.

כדי למנוע בעיות כאלה, מנהל ה-EVS מאפשר רק ללקוח master לתכנת פרמטר של מצלמה. לפני שמנסים לשנות פרמטר כלשהו של המצלמה, חובה להפוך את הלקוח ללקוח ראשי באמצעות קריאה לשיטה setMaster(). אם הפעולה הזו נכשלת, סימן שכבר יש לקוח מאסטר פעיל בחומרת המצלמה הזו. עד שהלקוח הראשי הנוכחי יוצא משימוש או מוותר באופן מפורש על תפקיד המאסטר דרך unsetMaster(), אף לקוח אחר לא רשאי לשנות פרמטר של מצלמה. כשלקוח מאסטר מחזיר את ההרשאה שלו, כל האפליקציות האחרות מקבלות הודעה על כך באמצעות אירוע MASTER_RELEASED.

לקוחות בעדיפות גבוהה

מנהל ה-EVS מטפל בלקוח שבבעלותו המסך עם העדיפות הגבוהה ומאפשר לו לגנוב תפקיד מאסטר ממאסטר קיים. מאחר שהבעלות על המסך ב-EVS מבוססת על הזמן שחלף מאז השימוש האחרון, הלקוח החדש יכול אפילו להשתלט על המסך מהלקוח הנוכחי.

לקוחות בעדיפות גבוהה צריכים לבצע קריאה ל-IEvsCamera::forceMaster(sp<IEvsDisplay>& display) כדי לקבל תפקיד מאסטר. מנהל ה-EVS בודק את המצב של מזהה תצוגה נתון, ואם (ובתנאי) המצב שלו תקין ושום אחד מהמזהים DisplayState::NOT_OPEN או DisplayState::DEAD לא מחליף מאסטר, הלקוח, שזה עתה איבד את תפקיד המאסטר, יקבל הודעה על כך באמצעות אירוע MASTER_RELEASED, וחייב לטפל בכך כראוי.