/**
* S2. Startup and general expected operation sequence:
*
* 1. Framework calls camera_module_t->common.open(), which returns a
* hardware_device_t structure.
*
* 2. Framework inspects the hardware_device_t->version field, and instantiates
* the appropriate handler for that version of the camera hardware device. In
* case the version is CAMERA_DEVICE_API_VERSION_3_0, the device is cast to
* a camera3_device_t.
*
* 3. Framework calls camera3_device_t->ops->initialize() with the framework
* callback function pointers. This will only be called this one time after
* open(), before any other functions in the ops structure are called.
*
* 4. The framework calls camera3_device_t->ops->configure_streams() with a list
* of input/output streams to the HAL device.
*
* 5. <= CAMERA_DEVICE_API_VERSION_3_1:
*
* The framework allocates gralloc buffers and calls
* camera3_device_t->ops->register_stream_buffers() for at least one of the
* output streams listed in configure_streams. The same stream is registered
* only once.
*
* >= CAMERA_DEVICE_API_VERSION_3_2:
*
* camera3_device_t->ops->register_stream_buffers() is not called and must
* be NULL.
*
* 6. The framework requests default settings for some number of use cases with
* calls to camera3_device_t->ops->construct_default_request_settings(). This
* may occur any time after step 3.
*
* 7. The framework constructs and sends the first capture request to the HAL,
* with settings based on one of the sets of default settings, and with at
* least one output stream, which has been registered earlier by the
* framework. This is sent to the HAL with
* camera3_device_t->ops->process_capture_request(). The HAL must block the
* return of this call until it is ready for the next request to be sent.
*
* >= CAMERA_DEVICE_API_VERSION_3_2:
*
* The buffer_handle_t provided in the camera3_stream_buffer_t array
* in the camera3_capture_request_t may be new and never-before-seen
* by the HAL on any given new request.
*
* 8. The framework continues to submit requests, and call
* construct_default_request_settings to get default settings buffers for
* other use cases.
*
* <= CAMERA_DEVICE_API_VERSION_3_1:
*
* The framework may call register_stream_buffers() at this time for
* not-yet-registered streams.
*
* 9. When the capture of a request begins (sensor starts exposing for the
* capture) or processing a reprocess request begins, the HAL
* calls camera3_callback_ops_t->notify() with the SHUTTER event, including
* the frame number and the timestamp for start of exposure. For a reprocess
* request, the timestamp must be the start of exposure of the input image
* which can be looked up with android.sensor.timestamp from
* camera3_capture_request_t.settings when process_capture_request() is
* called.
*
* <= CAMERA_DEVICE_API_VERSION_3_1:
*
* This notify call must be made before the first call to
* process_capture_result() for that frame number.
*
* >= CAMERA_DEVICE_API_VERSION_3_2:
*
* The camera3_callback_ops_t->notify() call with the SHUTTER event should
* be made as early as possible since the framework will be unable to
* deliver gralloc buffers to the application layer (for that frame) until
* it has a valid timestamp for the start of exposure (or the input image's
* start of exposure for a reprocess request).
*
* Both partial metadata results and the gralloc buffers may be sent to the
* framework at any time before or after the SHUTTER event.
*
* 10. After some pipeline delay, the HAL begins to return completed captures to
* the framework with camera3_callback_ops_t->process_capture_result(). These
* are returned in the same order as the requests were submitted. Multiple
* requests can be in flight at once, depending on the pipeline depth of the
* camera HAL device.
*
* >= CAMERA_DEVICE_API_VERSION_3_2:
*
* Once a buffer is returned by process_capture_result as part of the
* camera3_stream_buffer_t array, and the fence specified by release_fence
* has been signaled (this is a no-op for -1 fences), the ownership of that
* buffer is considered to be transferred back to the framework. After that,
* the HAL must no longer retain that particular buffer, and the
* framework may clean up the memory for it immediately.
*
* process_capture_result may be called multiple times for a single frame,
* each time with a new disjoint piece of metadata and/or set of gralloc
* buffers. The framework will accumulate these partial metadata results
* into one result.
*
* In particular, it is legal for a process_capture_result to be called
* simultaneously for both a frame N and a frame N+1 as long as the
* above rule holds for gralloc buffers (both input and output).
*
* 11. After some time, the framework may stop submitting new requests, wait for
* the existing captures to complete (all buffers filled, all results
* returned), and then call configure_streams() again. This resets the camera
* hardware and pipeline for a new set of input/output streams. Some streams
* may be reused from the previous configuration; if these streams' buffers
* had already been registered with the HAL, they will not be registered
* again. The framework then continues from step 7, if at least one
* registered output stream remains (otherwise, step 5 is required first).
*
* 12. Alternatively, the framework may call camera3_device_t->common->close()
* to end the camera session. This may be called at any time when no other
* calls from the framework are active, although the call may block until all
* in-flight captures have completed (all results returned, all buffers
* filled). After the close call returns, no more calls to the
* camera3_callback_ops_t functions are allowed from the HAL. Once the
* close() call is underway, the framework may not call any other HAL device
* functions.
*
* 13. In case of an error or other asynchronous event, the HAL must call
* camera3_callback_ops_t->notify() with the appropriate error/event
* message. After returning from a fatal device-wide error notification, the
* HAL should act as if close() had been called on it. However, the HAL must
* either cancel or complete all outstanding captures before calling
* notify(), so that once notify() is called with a fatal error, the
* framework will not receive further callbacks from the device. Methods
* besides close() should return -ENODEV or NULL after the notify() method
* returns from a fatal error message.
*/