feat: frameProcessorFps="auto" and automatic performance suggestions (throttle or increase FPS) (#393)
				
					
				
			* Add `onFrameProcessorPerformanceSuggestionAvailable` and make `frameProcessorFps` support `auto` * Implement performance suggestion and auto-adjusting * Fix FPS setting, evaluate correctly * Floor suggested FPS * Remove `console.log` for frame drop warnings. * Swift format * Use `30` magic number * only call if FPS is different * Update CameraView.swift * Implement Android 1/2 * Cleanup * Update `frameProcessorFps` if available * Optimize `FrameProcessorPerformanceDataCollector` initialization * Cache call * Set frameProcessorFps directly (Kotlin setter) * Don't suggest if same value * Call suggestion every second * reset time on set * Always store 15 last samples * reset counter too * Update FrameProcessorPerformanceDataCollector.swift * Update CameraView+RecordVideo.swift * Update CameraView.kt * iOS: Redesign evaluation * Update CameraView+RecordVideo.swift * Android: Redesign evaluation * Update CameraView.kt * Update REA to latest alpha and install RNScreens * Fix frameProcessorFps updating
This commit is contained in:
		@@ -0,0 +1,53 @@
 | 
			
		||||
package com.mrousavy.camera
 | 
			
		||||
 | 
			
		||||
import android.util.Log
 | 
			
		||||
import com.facebook.react.bridge.Arguments
 | 
			
		||||
import com.facebook.react.bridge.ReactContext
 | 
			
		||||
import com.facebook.react.bridge.WritableMap
 | 
			
		||||
import com.facebook.react.uimanager.events.RCTEventEmitter
 | 
			
		||||
 | 
			
		||||
fun CameraView.invokeOnInitialized() {
 | 
			
		||||
  Log.i(CameraView.TAG, "invokeOnInitialized()")
 | 
			
		||||
 | 
			
		||||
  val reactContext = context as ReactContext
 | 
			
		||||
  reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "cameraInitialized", null)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun CameraView.invokeOnError(error: Throwable) {
 | 
			
		||||
  Log.e(CameraView.TAG, "invokeOnError(...):")
 | 
			
		||||
  error.printStackTrace()
 | 
			
		||||
 | 
			
		||||
  val cameraError = when (error) {
 | 
			
		||||
    is CameraError -> error
 | 
			
		||||
    else -> UnknownCameraError(error)
 | 
			
		||||
  }
 | 
			
		||||
  val event = Arguments.createMap()
 | 
			
		||||
  event.putString("code", cameraError.code)
 | 
			
		||||
  event.putString("message", cameraError.message)
 | 
			
		||||
  cameraError.cause?.let { cause ->
 | 
			
		||||
    event.putMap("cause", errorToMap(cause))
 | 
			
		||||
  }
 | 
			
		||||
  val reactContext = context as ReactContext
 | 
			
		||||
  reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "cameraError", event)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun CameraView.invokeOnFrameProcessorPerformanceSuggestionAvailable(currentFps: Double, suggestedFps: Double) {
 | 
			
		||||
  Log.e(CameraView.TAG, "invokeOnFrameProcessorPerformanceSuggestionAvailable(suggestedFps: $suggestedFps):")
 | 
			
		||||
 | 
			
		||||
  val event = Arguments.createMap()
 | 
			
		||||
  val type = if (suggestedFps > currentFps) "can-use-higher-fps" else "should-use-lower-fps"
 | 
			
		||||
  event.putString("type", type)
 | 
			
		||||
  event.putDouble("suggestedFrameProcessorFps", suggestedFps)
 | 
			
		||||
  val reactContext = context as ReactContext
 | 
			
		||||
  reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "cameraPerformanceSuggestionAvailable", event)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
private fun errorToMap(error: Throwable): WritableMap {
 | 
			
		||||
  val map = Arguments.createMap()
 | 
			
		||||
  map.putString("message", error.message)
 | 
			
		||||
  map.putString("stacktrace", error.stackTraceToString())
 | 
			
		||||
  error.cause?.let { cause ->
 | 
			
		||||
    map.putMap("cause", errorToMap(cause))
 | 
			
		||||
  }
 | 
			
		||||
  return map
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user