@@ -117,119 +117,124 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase {
117117 if ( ! this . surfaceView ) {
118118 return ;
119119 }
120- const surfaceHolder = this . surfaceView . getHolder ( ) ;
121- const cameraFacingRequested = this . preferFrontCamera ? android . hardware . Camera . CameraInfo . CAMERA_FACING_FRONT : android . hardware . Camera . CameraInfo . CAMERA_FACING_BACK ;
122- const cameraInfo = new android . hardware . Camera . CameraInfo ( ) ;
123-
124- let requestedCameraId = android . hardware . Camera . CameraInfo . CAMERA_FACING_BACK ; // use this as the default
125- for ( let i = 0 ; i < android . hardware . Camera . getNumberOfCameras ( ) ; ++ i ) {
126- android . hardware . Camera . getCameraInfo ( i , cameraInfo ) ;
127- if ( cameraInfo . facing === cameraFacingRequested ) {
128- requestedCameraId = i ;
129- break ;
120+ try {
121+
122+ const surfaceHolder = this . surfaceView . getHolder ( ) ;
123+ const cameraFacingRequested = this . preferFrontCamera ? android . hardware . Camera . CameraInfo . CAMERA_FACING_FRONT : android . hardware . Camera . CameraInfo . CAMERA_FACING_BACK ;
124+ const cameraInfo = new android . hardware . Camera . CameraInfo ( ) ;
125+
126+ let requestedCameraId = android . hardware . Camera . CameraInfo . CAMERA_FACING_BACK ; // use this as the default
127+ for ( let i = 0 ; i < android . hardware . Camera . getNumberOfCameras ( ) ; ++ i ) {
128+ android . hardware . Camera . getCameraInfo ( i , cameraInfo ) ;
129+ if ( cameraInfo . facing === cameraFacingRequested ) {
130+ requestedCameraId = i ;
131+ break ;
132+ }
130133 }
131- }
132- this . camera = android . hardware . Camera . open ( requestedCameraId ) ;
134+ this . camera = android . hardware . Camera . open ( requestedCameraId ) ;
133135
134- let sizePair = this . selectSizePair ( this . camera , 1400 , 1200 ) ; // TODO based on wrapping frame
136+ let sizePair = this . selectSizePair ( this . camera , 1400 , 1200 ) ; // TODO based on wrapping frame
135137
136- if ( ! sizePair ) {
137- console . log ( "Could not find suitable preview size." ) ;
138- return ;
139- }
138+ if ( ! sizePair ) {
139+ console . log ( "Could not find suitable preview size." ) ;
140+ return ;
141+ }
140142
141- const pictureSize = sizePair . pictureSize ;
142- const previewSize = sizePair . previewSize ;
143+ const pictureSize = sizePair . pictureSize ;
144+ const previewSize = sizePair . previewSize ;
143145
144- console . log ( "sizePair.pictureSize: " + pictureSize . width + "x" + pictureSize . height ) ;
145- console . log ( "sizePair.previewSize: " + previewSize . width + "x" + previewSize . height ) ;
146+ console . log ( "sizePair.pictureSize: " + pictureSize . width + "x" + pictureSize . height ) ;
147+ console . log ( "sizePair.previewSize: " + previewSize . width + "x" + previewSize . height ) ;
146148
147- const parameters = this . camera . getParameters ( ) ;
149+ const parameters = this . camera . getParameters ( ) ;
148150
149- if ( pictureSize ) {
150- parameters . setPictureSize ( pictureSize . width , pictureSize . height ) ;
151- }
152- parameters . setPreviewSize ( previewSize . width , previewSize . height ) ;
153- parameters . setPreviewFormat ( android . graphics . ImageFormat . NV21 ) ;
151+ if ( pictureSize ) {
152+ parameters . setPictureSize ( pictureSize . width , pictureSize . height ) ;
153+ }
154+ parameters . setPreviewSize ( previewSize . width , previewSize . height ) ;
155+ parameters . setPreviewFormat ( android . graphics . ImageFormat . NV21 ) ;
154156
155- this . setRotation ( this . camera , parameters , requestedCameraId ) ;
157+ this . setRotation ( this . camera , parameters , requestedCameraId ) ;
156158
157- if ( parameters . getSupportedFocusModes ( ) . contains ( android . hardware . Camera . Parameters . FOCUS_MODE_CONTINUOUS_VIDEO ) ) {
158- parameters . setFocusMode ( android . hardware . Camera . Parameters . FOCUS_MODE_CONTINUOUS_VIDEO ) ;
159- }
159+ if ( parameters . getSupportedFocusModes ( ) . contains ( android . hardware . Camera . Parameters . FOCUS_MODE_CONTINUOUS_VIDEO ) ) {
160+ parameters . setFocusMode ( android . hardware . Camera . Parameters . FOCUS_MODE_CONTINUOUS_VIDEO ) ;
161+ }
160162
161- if ( this . torchOn ) {
162- if ( parameters . getSupportedFlashModes ( ) && parameters . getSupportedFlashModes ( ) . contains ( android . hardware . Camera . Parameters . FLASH_MODE_TORCH ) ) {
163- parameters . setFlashMode ( android . hardware . Camera . Parameters . FLASH_MODE_TORCH ) ;
163+ if ( this . torchOn ) {
164+ if ( parameters . getSupportedFlashModes ( ) && parameters . getSupportedFlashModes ( ) . contains ( android . hardware . Camera . Parameters . FLASH_MODE_TORCH ) ) {
165+ parameters . setFlashMode ( android . hardware . Camera . Parameters . FLASH_MODE_TORCH ) ;
166+ }
164167 }
165- }
166168
167- this . camera . setParameters ( parameters ) ;
169+ this . camera . setParameters ( parameters ) ;
168170
169- this . detector = this . createDetector ( ) ;
170- const onSuccessListener = this . createSuccessListener ( ) ;
171- const onFailureListener = this . createFailureListener ( ) ;
172-
173- let metadata =
174- new com . google . firebase . ml . vision . common . FirebaseVisionImageMetadata . Builder ( )
175- . setFormat ( com . google . firebase . ml . vision . common . FirebaseVisionImageMetadata . IMAGE_FORMAT_NV21 )
176- . setWidth ( previewSize . width )
177- . setHeight ( previewSize . height )
178- . setRotation ( this . rotation )
179- . build ( ) ;
180-
181- let throttle = 0 ;
182- this . camera . setPreviewCallbackWithBuffer ( new android . hardware . Camera . PreviewCallback ( {
183- onPreviewFrame : ( byteArray , camera ) => {
184-
185- if ( this . pendingFrameData !== null ) {
186- camera . addCallbackBuffer ( this . pendingFrameData . array ( ) ) ;
187- this . pendingFrameData = null ;
188- }
171+ this . detector = this . createDetector ( ) ;
172+ const onSuccessListener = this . createSuccessListener ( ) ;
173+ const onFailureListener = this . createFailureListener ( ) ;
189174
190- if ( ! this . bytesToByteBuffer . has ( byteArray ) ) {
191- console . log ( "Skipping frame" ) ;
192- return ;
193- }
175+ let metadata =
176+ new com . google . firebase . ml . vision . common . FirebaseVisionImageMetadata . Builder ( )
177+ . setFormat ( com . google . firebase . ml . vision . common . FirebaseVisionImageMetadata . IMAGE_FORMAT_NV21 )
178+ . setWidth ( previewSize . width )
179+ . setHeight ( previewSize . height )
180+ . setRotation ( this . rotation )
181+ . build ( ) ;
194182
195- this . pendingFrameData = this . bytesToByteBuffer . get ( byteArray ) ;
183+ let throttle = 0 ;
184+ this . camera . setPreviewCallbackWithBuffer ( new android . hardware . Camera . PreviewCallback ( {
185+ onPreviewFrame : ( byteArray , camera ) => {
196186
197- if ( throttle ++ % this . processEveryNthFrame !== 0 ) {
198- return ;
199- }
187+ if ( this . pendingFrameData !== null ) {
188+ camera . addCallbackBuffer ( this . pendingFrameData . array ( ) ) ;
189+ this . pendingFrameData = null ;
190+ }
191+
192+ if ( ! this . bytesToByteBuffer . has ( byteArray ) ) {
193+ console . log ( "Skipping frame" ) ;
194+ return ;
195+ }
196+
197+ this . pendingFrameData = this . bytesToByteBuffer . get ( byteArray ) ;
200198
201- let data = this . pendingFrameData ;
202- // pendingFrameData = null;
203-
204- if ( this . detector . processImage ) {
205- this . lastVisionImage = com . google . firebase . ml . vision . common . FirebaseVisionImage . fromByteBuffer ( data , metadata ) ;
206- this . detector
207- . processImage ( this . lastVisionImage )
208- . addOnSuccessListener ( onSuccessListener )
209- . addOnFailureListener ( onFailureListener ) ;
210- } else if ( this . detector . detectInImage ) {
211- this . lastVisionImage = com . google . firebase . ml . vision . common . FirebaseVisionImage . fromByteBuffer ( data , metadata ) ;
212- this . detector
213- . detectInImage ( this . lastVisionImage )
214- . addOnSuccessListener ( onSuccessListener )
215- . addOnFailureListener ( onFailureListener ) ;
216- } else {
217- this . runDetector ( data , previewSize . width , previewSize . height ) ;
199+ if ( throttle ++ % this . processEveryNthFrame !== 0 ) {
200+ return ;
201+ }
202+
203+ let data = this . pendingFrameData ;
204+ // pendingFrameData = null;
205+
206+ if ( this . detector . processImage ) {
207+ this . lastVisionImage = com . google . firebase . ml . vision . common . FirebaseVisionImage . fromByteBuffer ( data , metadata ) ;
208+ this . detector
209+ . processImage ( this . lastVisionImage )
210+ . addOnSuccessListener ( onSuccessListener )
211+ . addOnFailureListener ( onFailureListener ) ;
212+ } else if ( this . detector . detectInImage ) {
213+ this . lastVisionImage = com . google . firebase . ml . vision . common . FirebaseVisionImage . fromByteBuffer ( data , metadata ) ;
214+ this . detector
215+ . detectInImage ( this . lastVisionImage )
216+ . addOnSuccessListener ( onSuccessListener )
217+ . addOnFailureListener ( onFailureListener ) ;
218+ } else {
219+ this . runDetector ( data , previewSize . width , previewSize . height ) ;
220+ }
218221 }
219- }
220- } ) ) ;
222+ } ) ) ;
221223
222- this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
223- this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
224- this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
225- this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
224+ this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
225+ this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
226+ this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
227+ this . camera . addCallbackBuffer ( this . createPreviewBuffer ( previewSize ) ) ;
226228
227- this . camera . setPreviewDisplay ( surfaceHolder ) ;
229+ this . camera . setPreviewDisplay ( surfaceHolder ) ;
228230
229- if ( ! this . pause ) {
230- this . camera . startPreview ( ) ;
231- }
231+ if ( ! this . pause ) {
232+ this . camera . startPreview ( ) ;
233+ }
232234
235+ } catch ( e ) {
236+ console . log ( "Error in Firebase MLKit's runCamera function: " + e ) ;
237+ }
233238 } , 500 ) ;
234239 }
235240
0 commit comments