نمای دوربین HAR

نهادهای نظارتی دولتی چندین الزام را اجرا می‌کنند تا اطمینان حاصل شود که دید غیرمستقیم عقب اطلاعات کافی برای مانور دادن دقیق و به‌موقع خودرو را فراهم می‌کند. این امر بر آگاهی راننده از محیط اطراف تأثیر می‌گذارد.

برای سیستم‌های دید عقب براساس «سیستم پایش دوربین» (CMS)، «اداره ملی ایمنی ترافیک بزرگراه‌ها» (NHTSA) ملزم می‌کند که این الزامات را برآورده کنید (S6.6.2.3 که از UNECE46 ارجاع داده شده است):

  • S5.5.3 زمان پاسخ. تصویر آینه‌ای که الزامات S5.5.1 (میدان دید) و S5.5.2 (اندازه) را برآورده می‌کند، وقتی مطابق با S14.2 آزمایش می‌شود، ظرف ۲٫۰ ثانیه پس‌از شروع رویداد دنده‌عقب نمایش داده می‌شود.

  • S5.5.4 زمان ماندگاری. تصویر آینه‌ای که الزامات S5.5.1 و S5.5.2 را برآورده می‌کند پس‌از پایان رویداد دنده‌عقب نمایش داده نمی‌شود.

  • S5.5.5 غیرفعال‌سازی. تصویر آینه‌ای که الزامات S5.5.1 و S5.5.2 را برآورده می‌کند درطول رویداد دنده‌عقب تا زمانی‌که راننده نما را تغییر دهد یا انتخابگر جهت خودرو از وضعیت دنده عقب خارج شود نمایان می‌ماند.

  • ‫S6.6.2.3.3.5 آرتیفکت‌ها. راهنمای بهره‌بردار باید به مصنوعات احتمالی و تأثیر آن‌ها بر انسداد جزئی میدان دید و اشیا اشاره کند، که ممکن است راننده را ملزم کند که به‌طور ویژه هوشیار و مراقب باشد.

  • S6.2.2.3.4.1 نرخ فریم. حرکت اشیا در مقابل دوربین به‌صورت روان و یکپارچه ارائه می‌شود. حداقل نرخ فریم سیستم حداقل ۳۰ هرتز (معادل ۳۰ فریم در ثانیه) است. در شرایط کم‌نور یا هنگام مانور دادن با سرعت کم، حداقل نرخ فریم سیستم ۱۵ هرتز است.

  • S6.2.2.3.4.2 زمان تشکیل تصویر. زمان تشکیل تصویر پایشگر در دمای ۲۲ درجه سانتی‌گراد ± ۵ درجه سانتی‌گراد کمتر از ۵۵ میلی‌ثانیه است.

  • ‫S6.2.2.3.4.3 تأخیر سیستم. سیستم پایش دوربین (CMS) تأخیر کافی کوتاهی دارد تا مناظر را تقریباً در همان زمان ارائه دهد. تأخیر در دمای ۲۲ درجه سانتی‌گراد ±۵ درجه سانتی‌گراد کمتر از ۲۰۰ میلی‌ثانیه است.

برای رعایت این الزامات در AAOS بدون واسطه، سیستم نمای گسترده (EVS) سیستم‌عامل Android Automotive (AAOS) را معرفی کردیم. سرویس مشابهی برای مجازی‌سازی در دستگاه‌های AAOS با پردازنده با دردسترس بودن بالا (HAR) معرفی کردیم که مطابقت با این الزامات را نیز نشان می‌دهد.

خط لوله پیش‌نمایش دوربین

این پنج مرحله خط لوله پیش‌نمایش دوربین را تشکیل می‌دهند:

مراحل خط لوله پیش‌نمای دوربین

شکل ۱. مراحل خط لوله پیش‌نمای دوربین.

مسدود کردن سرویس دوربین به پلاتفرم «سرویس دوربین» و لایه انتزاعی آن اشاره دارد که به برنامه‌ها اجازه می‌دهد به دوربین‌های دردسترس دسترسی داشته باشند و از آن‌ها استفاده کنند. عملکرد «سرویس نمایش» داده‌های تصویر را برای کاربران به‌تصویر می‌کشد. برنامه سفرهای کاربر هدف را با «سرویس دوربین» و «سرویس نمایشگر» پیاده‌سازی می‌کند.

سفر کاربر نمایان بودن عقب اصلی به این صورت است:

  1. راننده انتخابگر جهت (چرخ‌دنده) را روی «عقب» قرار می‌دهد تا رویداد عقب رفتن را راه‌اندازی کند.

  2. سیستم رویداد پشتیبان را همه‌فرستی می‌کند. برنامه همه‌فرستی را دریافت می‌کند و واحد ورودی دوربین (سرویس دوربین) و واحد پردازنده (سرویس نمایشگر) را مقداردهی اولیه می‌کند.

  3. واحد ورودی دوربین پلاتفرم «خدمات دوربین» را مقداردهی اولیه می‌کند و دستگیره سرویس را به برنامه برمی‌گرداند.

  4. پردازنده پنجره نمای ورودی دوربین را از مرحله ۴ مقداردهی اولیه می‌کند.

  5. برنامه برای شروع ارسال بافرهای قاب و رویدادها، ورودی دوربین را مسدود می‌کند.

  6. برنامه بااستفاده از برگشت تماس (ناهمگام)، بافرهای قاب تحویل‌شده را در صف قرار می‌دهد. بافرهای قاب متعلق به بلوک ورودی دوربین هستند، بنابراین برنامه نمی‌تواند آن‌ها را تغییر دهد.

  7. برنامه بافر قاب را از صف خارج می‌کند (اگر صف خالی نباشد) و نمای کاربر را می‌سازد. کاربران می‌توانند برای اصلاح محتوا کپی تهیه کنند.

  8. برنامه یک بافر به رندرکننده ارسال می‌کند.

  9. پردازنده محتوای بافر دریافتی را روی نمایشگر رسم می‌کند.

  10. اگر رویداد پشتیبان‌گیری همچنان درحال انجام است، به «مرحله ۷» بروید. وقتی رویداد پشتیبان تکمیل می‌شود، برنامه از بلوک ورودی دوربین می‌خواهد که پس‌از پنهان کردن نما از کاربر، ارسال بافرهای قاب و رویدادها را متوقف کند.

  11. برنامه به‌صورت اختیاری دوربین را می‌بندد و پردازنده را آزاد می‌کند.

شکل ۱ این جریان را نشان می‌دهد. این تصویر از عناصر API کتابخانه دوربین QNX برای استفاده از پلاتفرم «خدمات دوربین» استفاده می‌کند.

مسیر کاربر اصلی HAR

شکل ۲. مسیر کاربر اصلی HAR.

بلوک ورودی دوربین سه میان‌گیری را اعلام می‌کند:

  • CameraManager، روش‌هایی را برای مدیریت دستگاه‌های دوربین تعریف می‌کند؛ برای مثال، برنامه از این میانای کاربری برای باز کردن (رزرو کردن) دستگاه دوربین هدف استفاده می‌کند.

  • CameraDevice روش‌هایی را برای کنترل دستگاه دوربین اعلام می‌کند؛ برای مثال، شروع یا توقف جاری‌سازی داده.

  • ‫CameraStreamListener یک روش واحد برای دریافت رویدادهای مختلف از دوربین هدف اعلام می‌کند.

طراحی

این بخش جزئیات طراحی سیستم را شرح می‌دهد.

تجربه کاربری

وقتی راننده دنده را در حالت دنده عقب قرار می‌دهد، می‌تواند دوربین عقب را در نمایشگر کیلومترشمار پیش‌نمایش کند. وقتی راننده دنده را از حالت دنده عقب خارج می‌کند، نمایشگر پیش‌نمایش دوربین را متوقف می‌کند.

سفرهای کاربر اضافی را می‌توانید فعال کنید. برای مثال، راننده می‌تواند وقتی چراغ راهنما فعال می‌شود، ناحیه‌ای را که در آینه‌ها دیده نمی‌شود پیش‌نمایش کند.

شروع پیش‌نمایش دوربین

هنگام استفاده از دوربین‌ها، برنامه دوربین‌های دردسترس را فهرست می‌کند و ارزیابی می‌کند تا بهترین دوربین را برای هدف موردنظر پیدا کند. برای مثال، برای دید عقب، برنامه از فهرست دوربین‌های دردسترس، دوربینی را جستجو می‌کند که سمت عقب خودرو را نشان دهد.

برنامه این را با بررسی ویژگی‌های هر دوربین، برای مثال، مکان، جهت لنز، نرخ فریم، وضوح خروجی، و قالب خروجی ارزیابی می‌کند. اگر چند دوربین ویژگی‌های موردنیاز یکسانی داشته باشند، برنامه ممکن است ویژگی‌های دیگری مثل میدان دید و فاصله کانونی را بررسی کند.

این تصویر توالی شروع پیش‌نمایش دوربین با پیکربندی دوربین ثابت را نشان می‌دهد:

شروع پیش‌نمایش دوربین با پیکربندی دوربین ایستا

شکل ۳. پیش‌نمایش دوربین را با پیکربندی دوربین ایستا شروع کنید.

متوقف کردن پیش‌نمای دوربین

وقتی رویداد دنده‌عقب پایان می‌یابد، برنامه دیگر دید عقب را ارائه نمی‌دهد. برای جلوگیری از نمایش صفحه خالی یا تصویر ثابت، برنامه ابتدا نمای کاربر را پنهان می‌کند و سپس درخواست می‌کند که واحد ورودی دوربین ارسال رویدادها را متوقف کند.

این تصویر توالی توقف جاری‌سازی داده از دستگاه دوربین هدف را نشان می‌دهد:

توقف جاری‌سازی داده از دستگاه دوربین هدف

شکل ۴. جاری‌سازی داده‌ها از دستگاه دوربین هدف را متوقف کنید.

خطاها

دستگاه دوربین می‌تواند به‌طور غیرمنتظره ارسال بافر قاب جدید را متوقف کند. برای تشخیص چنین حوادثی، ممکن است واحد ورودی دوربین زمان‌سنجی را پیاده‌سازی کند که با رسیدن قاب جدید منقضی می‌شود و وقتی این زمان‌سنج منقضی می‌شود، اعلانی ارسال می‌کند.

وقتی برنامه اعلانی دریافت می‌کند، به کاربر اطلاع می‌دهد که پیش‌نمایش دوربین دیگر زنده نیست و با بستن دستگاه دوربین و باز کردن دوباره آن، سعی می‌کند پیش‌نمایش دوربین را بازیابی کند. شکل ۵ نشان می‌دهد که برنامه چگونه مهلت زمانی را مدیریت می‌کند:

رسیدگی به مهلت زمانی

شکل ۵. درحال مدیریت کردن زمان اتمام (جریان داده معلقه).

واحد ورودی دوربین می‌تواند حوادثی به‌جز جاری‌سازی داده‌های معلقه را گزارش کند و جزئیات بیشتری را در بافرها جاسازی کند. تولیدکنندگان تجهیزات اصلی می‌توانند از این فراداده رویداد برای رسیدگی به حوادث در پلاتفرم خود استفاده کنند.

فعالیت‌ها

برنامه‌هایی که روی میزبان اجرا می‌شوند و نمایشگر صفحه ابزار را ازطریق HAR (بلوک‌های آبی در نمودار زیر) مدیریت می‌کنند از این API استفاده می‌کنند.

نمودار سیستم در «شکل ۵» نشان داده شده است:

نمودار سیستم

شکل ۶. نمودار سیستم.

خدمات

انتظار می‌رود فراخوانی‌های API در بافت فرایند فراخوانی اجرا شود.

میاناهای برنامه‌سازی کاربردی

میانای برنامه‌سازی کاربردی جدید فقط برای برنامه‌هایی درنظر گرفته شده است که پیش‌نمایش‌های دوربین را در نمایشگر دسته‌ابزار ازطریق HAR مدیریت می‌کنند. «میانای برنامه‌سازی کاربردی» ازطریق لایه انتزاع پلاتفرم دردسترس است و به‌صورت پویا پیوند می‌دهد.

میانای CameraInputBlock روش‌هایی را برای راه‌اندازی عملکرد دوربین و دریافت مدیر بلوک ورودی تعریف می‌کند. برنامه از نمونه برگشتی CameraManager برای مدیریت دستگاه‌های دوربین استفاده می‌کند.

// This class represents a camera input block for the application that manages the
// instrument cluster display with Harry.
public class CameraInputBlock : public InputBlock {
    public:
        // Clean up the resources.
        virtual ~CameraInputBlock();

        // A method inherited from InputBlock class. This method initializes
        // CameraInputBlock instance; e.g. checking the platform camera service
        // is live.
        //
        // @return CAMERA_EPERM if the platform camera service is not
        //                      available.
        //         CAMERA_OK otherwise.
        virtual CameraError init() override;

        // A method inherited from InputBlock class. This method release all
        // resources held by this CameraInputBlock instance.
        virtual void release() override;

        // This method returns a CameraManager instance. The caller uses
        // this instance to manage camera devices.
        //
        // @param out If this method is successful, this points to a valid
        //            CameraManager instance.
        // @return CAMERA_EACCESS when we fail to create CameraManager instance
        //         to return.
        //         CAMERA_OK otherwise.
        virtual CameraError getCameraManager(
            std::shared_ptr<CameraManager>* out) = 0;

    private:
        // Handle to manage camera devices.
        std::shared_ptr<CameraManager> mMgr;

        // Handle to manage camera devices that have been opened by clients.
        std::set<CameraDevice> mCameras;
};

کلاس CameraManager روش‌هایی را برای باز کردن (یا مالکیت) دوربین‌ها و آزاد کردن آن‌ها وقتی برنامه کارش با آن دوربین تمام می‌شود تعریف می‌کند. برنامه می‌تواند بیش از یک دوربین را باز کند و از جاری‌سازی‌های آن‌ها برای ایجاد میدان دید وسیع‌تر یا تجربه چندنمایی استفاده کند.

// This pure virtual class declares methods to manage camera devices.
public class CameraManager {
    public:
        // This method returns a list of CameraDescriptor objects representing
        // available cameras.
        //
        // @param out A list of CameraDescriptor instances. This list may be
        //            empty if the platform camera service does not list any
        //            camera.
        // @return CAMERA_EACCESS if we failed to build a camera list.
        //         CAMERA_OK otherwise.
        virtual CameraError getCameraList(
            std::vector<CameraDescriptor>* out) = 0;

        // Open a camera device associated with a given string identifier.
        //
        // @param ID A string identifier of a camera device to request.
        // @param out A pointer to CameraDevice shared pointer object. This
        //            is null when we fail to open a target device.
        // @return CAMERA_ENODEV if no camera is associated with a given id.
        //         CAMERA_EACCESS if it fails to open a target device.
        //         CAMERA_OK otherwise.
        virtual CameraError open(
            std::string ID, std::shared_ptr<CameraDevice>* out) = 0;

        // Close a camera device associated with a given string identifier.
        // This method is assumed to be always successful.
        //
        // @param id A string identifier of a camera device to close.
        virtual void close(std::string id) = 0;
};

اگر برنامه‌ها نتوانند تشخیص دهند از کدام دوربین استفاده کنند، برنامه‌ها می‌توانند دوربینی را انتخاب کنند که در آن زمینه بهترین عملکرد را دارد. CameraManager::getCameraList() فهرستی از نمونه‌های CameraDescriptor را برمی‌گرداند که ویژگی‌های هر دوربین را ارائه می‌دهد.

کلاس CameraDevice نشان‌دهنده یک دستگاه دوربین تکی است و روش‌هایی را برای شروع و توقف جاری‌سازی داده‌های آن اعلام می‌کند. اگر مشخصات دوربین به‌صورت ایستا شناخته نشده باشد، مشتریان آن‌ها را از توصیفگرشان دریافت می‌کنند و آن‌ها را تجزیه می‌کنند.

برای مثال، یک کارخواه می‌تواند از فراداده‌های دستگاه دوربین هدف، فهرستی از پیکربندی‌های جاری‌سازی را دریافت کند و پیکربندی با بهترین مشخصه‌ها (برای مثال، نرخ‌های فریم، وضوح، و قالب خروجی) را انتخاب کند.

// This class represents a single camera device.
public class CameraDevice {
    public:
        // Start a data stream that attributes are matching to given
        // configuration best.
        // If a selected configuration is not given (null), a data stream is
        // initiated in its default configuration and return.
        //
        // @param configuration Selected attributes of the imagery data stream.
        // @param listener An object to listen to an active data stream.
        // @param effective Actual attributes of started data stream.
        // @return CAMERA_EINVAL if a listener object is invalid.
        //         CAMERA_EIO if we failed to start a video stream.
        //         CAMERA_OK otherwise.
        virtual CameraError start(
                std::shared_ptr<CameraStreamConfiguration>& configuration,
                std::shared_ptr<CameraStreamListener>& listener,
                std::shared_ptr<CameraStreamConfiguration>* effective) = 0;

        // Stop a data stream.
        virtual void stop() = 0;

        // Get a camera descriptor.
        //
        // @param desc A set of attributes that defines this camera device.
        // @return CAMERA_ENODATA if a descriptor is not available.
        //         CAMERA_OK otherwise.
        CameraError getDescriptor(std::shared_ptr<CameraDescriptor>* desc) = 0;

        // Return a consumed buffer to the camera device. A client of active
        // stream must return a frame buffer explicitly by calling this method.
        virtual void doneWithFrame(std::shared_ptr<FrameBuffer>& buffer) = 0;

    private:
        // Describe this camera device.
        CameraDescriptor mDescriptor;

        // A weak reference to a listening client.
        std::weak_ptr<CameraStreamListener> mClient;
};

// This class declares attributes that characterize a camera device.
public class CameraDescriptor {
    public:
        // Unique std::string object to identify a single camera device.
        std::string mId;

        // A set of stream configurations this camera device is capable of. A
        // camera must have at least one stream configuration.
        std::set<CameraStreamConfiguration> mConfigurations;

        // Are more attributes needed to exist, such as locations, lens
        // facing directions, and intrinsic/extrinsic parameters?
};

// This class declares attributes that characterize an imagery data stream.
public class CameraStreamConfiguration {
    public:
        // Width of output of this stream in pixels.
        unsigned int mWidthInPixels;

        // Height of output of this stream in pixels.
        unsigned int mHeightInPixels;

        // An average number of frames per second.
        double mFrameRate;

        // A format of this stream's output. A client could calculate a
        // byte-per-pixel (bpp) from this.
        CameraColorFormat mFormat;
};

// This class represents a listener/callback object to listen to frames and
// events.
public class CameraStreamListener {
    public:
        // A listener method to receive various stream events including a new
        // frame buffer.
        //
        // @param event CameraStreamEvent object that represents a single event
        //              such as an arrival of a new frame buffer, camera stream
        //              is terminated, and so forth.
        virtual void onEvent(std::shared_ptr<CameraStreamEvent>* event) = 0;
};

‫CameraDevice::start() سه آرگومان می‌گیرد:

  • پیکربندی جاری‌سازی انتخاب‌شده توسط تماس‌گیرنده.

  • شنونده برای دریافت رویدادهای جاری‌سازی.

  • اشاره‌گر به پیکربندی جاری‌سازی مؤثر. به‌شدت توصیه می‌کنیم که تماس‌گیرنده این مقدار را بررسی کند تا بافر قاب‌های ورودی را همان‌طور که درنظر گرفته شده است مدیریت کند.

وقتی CameraDevice::start() جاری‌سازی داده را با پلاتفرم «خدمات دوربین» شروع می‌کند، مرجع ضعیفی به شیء شنونده تماس‌گیرنده نگه می‌دارد تا پایان غیرمنتظره تماس‌گیرنده را تشخیص دهد.

وقتی مشتری کار با بافر قاب را تمام می‌کند، مشتری باید با فراخوانی روش CameraDevice::doneWithFrame() به دستگاه دوربین اطلاع دهد که دیگر به بافر قاب نیاز ندارد.

وقتی جاری‌سازی شروع می‌شود، مشتری پیام‌های رویداد را دریافت می‌کند. پیام رایج عبارت است از بافر قاب جدید. ازطریق تابع تماس برگشتی ثبت‌شده، کارخواه رویداد kNewFrameBuffer را دریافت می‌کند که حاوی داده‌های تصویر همراه با فراداده‌های بافر قاب است. StreamEventType انواع بیشتری را برای مدیریت رویدادهای دیگر جاری‌سازی اعلام می‌کند. مثل جاری‌سازی داده متوقف‌شده یا معلق.

// This class lists events possibly occurring while a data stream is active.
enum class CameraStreamEventType {
    // A delivery of a new frame buffer.
    kNewFrameBuffer,
    // A data stream has been stopped.
    kStreamStopped,
    // No new frame buffer arrives for a while.
    kStreamHang,
    // Add more.
    ...
};

// This class represents a single instance of StreamEventType.
public class CameraStreamEvent {
    public:
        // Return a type of this event.
        //
        // @return CameraStreamEventType enum value.
        CameraStreamEventType getType() { return mType; }

        // Return a pointer to data associated with this event.
        //
        // @return A shared pointer object of the buffer that contains data for
        //         this event.
        std::shared_ptr<void> getData() { return mData; }

    private:
        // Describe a type of this event.
        CameraStreamEventType mType;

        // A pointer to the data buffer.
        std::shared_ptr<void> mData;
};

// This class inherits StreamEvent class and has additional fields to represent
// the frame buffer.
public class FrameBufferEvent : public CameraStreamEvent {
    public:
        // Return an identifier of this frame buffer.
        //
        // @return A unique integer value to identify this frame buffer.
        int getBufferID() { return mBufferID; }

        // Give access to frame buffer metadata.
        //
        // @return A shared pointer to the buffer that contains data besides
        //         the imagery data.
        std::shared_ptr<void> getMetadata() { return mMetadata; }

    private:
        // Unique integer to identify this buffer.
        int mBufferID;

        // A pointer to metadata of this frame buffer.
        std::shared_ptr<void> mMetadata;
};

این نمونه پیاده‌سازی رابط CameraInputBlock و برنامه آن را نشان می‌دهد:

CameraError getCameraManager(std::shared_ptr<CameraManager>* out) {
    // During an instantiation, CameraManager will retrieve a list of camera
    // devices from the platform camera service and identify their attributes.
    *out = std::make_shared<CameraManager>();
    return CAMERA_OK;
}

// This method returns a list of CameraDescriptor objects representing available
// cameras.
CameraError CameraManager::getCameraList(std::vector<CameraDescriptor>* out) {
    if (mCameraList.size() < 1) {
        // Query a list of cameras and get their attributes.
    }
    *out = mCameraList;
    return CAMERA_OK;
}

// Open a camera device associated with a given string identifier.
CameraError CameraManager::open(std::string id, std::shared_ptr<CameraDevice>* out) {
    if (!mCameraList.contains(id)) {
        // We cannot identify any camera with a given value.
        return CAMERA_NODEV;
    }

    // During a construction, CameraDevice will obtain a handle of a target
    // camera device from the platform camera service.
    std::shared_ptr<CameraDevice> h = std::make_shared<CameraDevice>(id);
    if (!h) {
        // We fail to open a camera device.
        return CAMERA_EACCESS;
    }

    *out = h;
    return CAMERA_OK;
}

// Close a camera device associated with a given string identifier. This method
// is assumed to be always successful.
void CameraManager::close(std::string id) {
    if (!mCameraList.contains(id)) {
        // We ignore calls with unknown identifiers.
        return;
    }

    // mCameraList.remove() returns an object removed from the list.
    std::shared_ptr<CameraDevice> device = mCameraList.remove(id);

    // Ensure a device stops streaming.
    device->stop();
}

// Start a data stream that attributes are matching to given configuration
// best.
// If a selected configuration is not given (null), a data stream will be
// initiated in its default configuration and return.
CameraError CameraDevice::start(
        std::shared_ptr<CameraStreamConfiguration>& configuration,
        std::shared_ptr<CameraStreamListener>& listener,
        std::shared_ptr<CameraStreamConfiguration>* effective) {
    if (!listener) {
        return CAMERA_EINVAL;
    }

    // selectStreamConfiguration examines this camera's stream configurations
    // and returns the one closest to the selected configuration.
    CameraStreamConfiguration config = selectStreamConfiguration(configuration);

    // mDevice refers to the camera handle for the platform camera service. We
    // may need to translate CameraStreamConfiguration for the platform service.
    mDevice->configure(
        configuration.mWidth, configuration.mHeight, configuration.mFormat);

    // Start a data stream with a callback object.
    if (!mDevice->startStream(mCallback)) {
        // We failed to start a data stream.
        return CAMERA_EIO;
    }

    return CAMERA_OK;
}

// Stop a data stream.
void CameraDevice::stop() {
    if (!mDevice) {
        // Nothing to do if we don't have a valid camera handle for the
        // platform camera service.
        return;
    }

    mDevice->stopStream();
}

// Get a camera descriptor.
CameraError CameraDevice::getDescriptor(std::shared_ptr<CameraDescriptor>* desc) {
    if (!mDescriptor) {
        return CAMERA_ENODATA;
    }

    *desc = *mDescriptor;
    return CAMERA_OK;
}

// Return a consumed buffer to the camera device. A client of active stream
// must return a frame buffer explicitly by calling this method.
void CameraDevice::doneWithFrame(std::shared_ptr<FrameBuffer>& buffer) {
    if (!mBufferRecords.contains(buffer.getId())) {
        // Ignore a call with unknown frame buffer.
        return;
    }

    // Simply remove from the record.
    (void)mBufferRecords.remove(buffer.getId());
}

// This method handles gear-shift events.
void Application::handleGearShift(GearSelection selection) {
    switch (selection) {
        case GEAR_SELECTION_REVERSE:
            // Upon the reverse gear selection, we are going to start a video
            // stream and show its preview on the instrument cluster display.
            (void)startStream(mCameraInputBlock);

            // FIXME: Exact method to control the camera preview window on the
            // instrument display is to be determined.
            show(mRearVisibilityWindow);
            break;

        default:
            // Upon all other gear selection, we are going to stop a video
            // stream (if it's running) and hide the preview.
            stopStream(mCameraInputBlock);

            // FIXME: Exact method to control the camera preview window on the
            // instrument display is to be determined.
            hide(mRearVisibilityWindow);
            break;
    }
}

bool Application::startStream(std::shared_ptr<CameraInputBlock> handle) {
    return handle->start(std::bind(&Application::handleStreamCallback, this);
}

void Application::stopStream(std::shared_ptr<CameraInputBlock> handle) {
    handle->stop();
}

// This method handles a stream callback.
void Application::handleStreamCallback(StreamEvent& event) {
    switch (event.getType()) {
        case StreamEventType::kNewFrameBuffer:
            // Handle a new frame buffer. We may just enqueue it for the
            // future or forward to CameraInputBlock client.
            break;

        case StreamEventType::kStreamStopped:
            // Handle as an incident if this event is not expected.
            break;

        // More cases to be added.
    }
}

void Application::handleNewFrameBuffer(StreamEvent& event) {
    // Enqueue a new frame buffer for the further processing. A buffer
    // must be returned explicitly by calling
    // CameraDevice.doneWithFrame(FrameBuffer&) method.
}

void Application::handleStreamEvent(StreamEvent& event) {
    // Handle a received stream event except a new frame buffer's
    // arrival; e.g. a video stream is terminated unexpectedly.
}

عملکرد

نمایان بودن عقب با این مقررات دولتی مطابقت دارد.

مقدار مقررات
زمان پاسخ‌دهی CFR 571.111 S5.5.3
نرخ فریم UNECE R46 6.2.2.3.4
زمان تشکیل تصویر UNECE R46 6.2.2.3.4.2
تأخیر سیستم UNECE R46 6.2.2.3.4.3

حریم خصوصی

مربوط به حریم خصوصی:

  • این میانای برنامه‌سازی کاربردی پیاده‌سازی‌ها را ملزم نمی‌کند اطلاعات شخصی شناساننده هویت (PII) را جمع‌آوری، ثبت، یا ذخیره کنند. بااین‌حال، چون داده‌های تصویربرداری ضبط‌شده (یا فراداده‌های منسوب) می‌تواند حاوی «اطلاعات شناساننده شخص» باشد، برنامه‌ای که از این API استفاده می‌کند باید رضایت صریح کاربر را دریافت کند.

  • کاربران نمی‌توانند دستگاه‌های دوربین را کنترل کنند تا در نمایشگر صفحه ابزار پیش‌نمایش داشته باشند زیرا دوربین‌ها در نقش‌های حیاتی ایمنی دخیل هستند. تولیدکنندگان تجهیزات اصلی درطول راه‌اندازی یا از راننده رضایت کاربر را دریافت می‌کنند.

  • این «میانای برنامه‌سازی کاربردی» از کارخواه‌های دوربین پس‌زمینه‌ای پشتیبانی نمی‌کند. بنابراین، نشانگر حریم خصوصی که به کاربران اطلاع می‌دهد دستگاه دوربین درحال ضبط داده است، خارج از محدوده این خط‌مشی است.