Manage camera buffer lifetime and limit preview listeners #1024
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Two main changes in this PR:
Prevent multiple listeners from being registered for OnPreviewFrameReady (SetupCamera calls it which is automatically called by SurfaceCreated() as well as from client code). Having a single listener prevents duplicate calls to Decode with the same camera buffer.
When we get a preview frame from the camera, we get a data buffer that was pulled from the camera's list of buffers. This buffer has to be added back to the camera before it can be reused, but it cannot be returned too early else the camera will start filling in the buffer before any background tasks are done with it.
This change removes automatically returning the camera buffer (which was previously done before the background task was complete), and requires the registered listener to add the buffer back when its done. This is done at the end of the processing of the background task. If we choose not to launch a task to decode, then we immediately add the buffer back.
This change also Disposes the fastArray only after we add the buffer back to the camera (to avoid releasing the handle and losing the buffer).
This will resolve issue #1023