معلمات التحكم في برنامج الكاميرا، معلمات التحكم في برنامج الكاميرا

في الإصدار السابق من نظام العرض الممتد (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 ) التي يمكن للعميل قراءتها وكتابتها (إذا كان العميل رئيسيًا)، وتقوم getIntParameterRange() بترحيل نطاق القيمة الصالحة والدقة. عندما يقوم عميل رئيسي بتغيير معلمة الكاميرا، يتم إخطار جميع العملاء الآخرين الموجودين على نفس جهاز الكاميرا عن طريق الحصول على حدث PARAMETER_CHANGED بمعرف المعلمة وقيمة جديدة.

ملاحظة: قد يتعامل برنامج تشغيل المستشعر مع قيم المعلمات غير الصالحة بشكل مختلف. قد يقوم ببساطة بإرجاع رمز خطأ أو قص القيمة في النطاق الصالح وتطبيقها. لذلك، تقوم طريقة setIntParameter() بإرجاع قيمة فعالة ويمكن للعميل استخدام هذه القيمة لتأكيد كيفية معالجة الطلب.

طلب التحكيم بين عملاء الكاميرا المتعددة

نظرًا لأن تصميم EVS السابق سمح لتطبيقات متعددة بالاشتراك في وقت واحد في جهاز كاميرا واحد، فمن الممكن أن يتمكن أحد التطبيقات من تعطيل عمليات التطبيقات الأخرى عن طريق تغيير معلمة الكاميرا. بالإضافة إلى ذلك، قد يرغب العديد من العملاء في ضبط نفس المعلمة بشكل مختلف وبالتالي يتسببون في سلوكيات غير متوقعة في تشغيل خدمات الكاميرا.

لتجنب مثل هذه المشكلات، يسمح مدير EVS للعميل الرئيسي فقط ببرمجة معلمة الكاميرا. قبل محاولة ضبط أي معلمة للكاميرا، يجب أن يصبح العميل عميلاً رئيسيًا عن طريق استدعاء الأسلوب setMaster() . إذا فشل هذا، فهذا يعني أن هناك بالفعل عميل رئيسي نشط على جهاز الكاميرا هذا. حتى يموت العميل الرئيسي الحالي، أو يتخلى بشكل صريح عن دور رئيسي من خلال unsetMaster() ، لا يُسمح لأي عميل آخر بتغيير معلمة الكاميرا. عندما يعيد العميل الرئيسي الامتياز الخاص به، يتم إخطار جميع التطبيقات الأخرى من خلال حدث MASTER_RELEASED .

العملاء ذوي الأولوية العالية

يتعامل مدير EVS مع العميل الذي يمتلك الشاشة بالأولوية العالية ويسمح له بسرقة دور رئيسي من السيد الحالي. ونظرًا لأن ملكية عرض EVS تعتمد على الحداثة، فيمكن للعميل الجديد أن يتولى مسؤولية العرض من العميل الحالي.

يجب على العملاء ذوي الأولوية العالية الاتصال بـ IEvsCamera::forceMaster(sp<IEvsDisplay>& display) للحصول على دور رئيسي. يقوم مدير EVS بفحص حالة مقبض العرض المحدد، وإذا ( وفقط إذا ) كانت حالته صالحة ولم يستبدل DisplayState::NOT_OPEN أو DisplayState::DEAD الرئيسي. يتم إخطار العميل، الذي يفقد الدور الرئيسي، عن طريق حدث MASTER_RELEASED ويجب عليه التعامل مع هذا بشكل صحيح.

,

في الإصدار السابق من نظام العرض الممتد (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 ) التي يمكن للعميل قراءتها وكتابتها (إذا كان العميل رئيسيًا)، وتقوم getIntParameterRange() بترحيل نطاق القيمة الصالحة والدقة. عندما يقوم عميل رئيسي بتغيير معلمة الكاميرا، يتم إخطار جميع العملاء الآخرين الموجودين على نفس جهاز الكاميرا عن طريق الحصول على حدث PARAMETER_CHANGED بمعرف المعلمة وقيمة جديدة.

ملاحظة: قد يتعامل برنامج تشغيل المستشعر مع قيم المعلمات غير الصالحة بشكل مختلف. قد يقوم ببساطة بإرجاع رمز خطأ أو قص القيمة في النطاق الصالح وتطبيقها. لذلك، تقوم طريقة setIntParameter() بإرجاع قيمة فعالة ويمكن للعميل استخدام هذه القيمة لتأكيد كيفية معالجة الطلب.

طلب التحكيم بين عملاء الكاميرا المتعددة

نظرًا لأن تصميم EVS السابق سمح لتطبيقات متعددة بالاشتراك في وقت واحد في جهاز كاميرا واحد، فمن الممكن أن يتمكن أحد التطبيقات من تعطيل عمليات التطبيقات الأخرى عن طريق تغيير معلمة الكاميرا. بالإضافة إلى ذلك، قد يرغب العديد من العملاء في ضبط نفس المعلمة بشكل مختلف وبالتالي التسبب في سلوكيات غير متوقعة في تشغيل خدمات الكاميرا.

لتجنب مثل هذه المشكلات، يسمح مدير EVS للعميل الرئيسي فقط ببرمجة معلمة الكاميرا. قبل محاولة ضبط أي معلمة للكاميرا، يجب أن يصبح العميل عميلاً رئيسيًا عن طريق استدعاء الأسلوب setMaster() . إذا فشل هذا، فهذا يعني أن هناك بالفعل عميل رئيسي نشط على جهاز الكاميرا هذا. حتى يموت العميل الرئيسي الحالي، أو يتخلى بشكل صريح عن دور رئيسي من خلال unsetMaster() ، لا يُسمح لأي عميل آخر بتغيير معلمة الكاميرا. عندما يعيد العميل الرئيسي الامتياز الخاص به، يتم إخطار جميع التطبيقات الأخرى من خلال حدث MASTER_RELEASED .

العملاء ذوي الأولوية العالية

يتعامل مدير EVS مع العميل الذي يمتلك الشاشة بالأولوية العالية ويسمح له بسرقة دور رئيسي من السيد الحالي. ونظرًا لأن ملكية عرض EVS تعتمد على الحداثة، فيمكن للعميل الجديد أن يتولى مسؤولية العرض من العميل الحالي.

يجب على العملاء ذوي الأولوية العالية الاتصال بـ IEvsCamera::forceMaster(sp<IEvsDisplay>& display) للحصول على دور رئيسي. يقوم مدير EVS بفحص حالة مقبض العرض المحدد، وإذا ( وفقط إذا ) كانت حالته صالحة ولم يستبدل DisplayState::NOT_OPEN أو DisplayState::DEAD الرئيسي. يتم إخطار العميل، الذي يفقد الدور الرئيسي، عن طريق حدث MASTER_RELEASED ويجب عليه التعامل مع هذا بشكل صحيح.