Report codec capabilities and document the expanded Android media header
This commit is contained in:
1 parent
bf12bd5b05
commit
de67de33df
2 files changed
+21
-21
No files matched your search
@@ -5,10 +5,9 @@ import android.hardware.camera2.CameraCharacteristics
|
||||
import android.hardware.camera2.CameraManager
|
||||
import android.media.MediaCodecInfo
|
||||
import android.media.MediaCodecList
|
||||
import android.media.MediaFormat
|
||||
import android.os.Build
|
||||
|
||||
/** Режим является пересечением возможностей камеры и конкретного Surface AVC encoder. */
|
||||
/** Режим является пересечением возможностей камеры и выбранного Surface encoder. */
|
||||
data class StreamCaptureMode(val camera: String, val width: Int, val height: Int, val fps: Int,
|
||||
val minimumFps: Int, val highSpeed: Boolean, val codec: String, val bitrate: Int,
|
||||
val videoCodec: StreamVideoCodec = StreamVideoCodec.H264,
|
||||
@@ -34,23 +33,24 @@ object StreamCameraModes {
|
||||
val modes = mutableListOf<StreamCaptureMode>()
|
||||
fun add(width: Int, height: Int, fps: Int, lower: Int, highSpeed: Boolean) {
|
||||
for (type in StreamVideoCodec.values()) {
|
||||
for (codec in codecs) {
|
||||
try {
|
||||
if (codec.supportedTypes.none { it.equals(type.mime, true) }) continue
|
||||
if (highSpeed && Build.VERSION.SDK_INT >= 29 && !codec.isHardwareAccelerated) continue
|
||||
val caps = codec.getCapabilitiesForType(type.mime)
|
||||
val video = caps.videoCapabilities
|
||||
if (!caps.colorFormats.contains(MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface) ||
|
||||
(type.profile != null && caps.profileLevels.none { it.profile == type.profile }) ||
|
||||
!video.areSizeAndRateSupported(width, height, fps.toDouble())) continue
|
||||
val bitrate = (width.toLong() * height * fps / 14).coerceIn(512_000L, 16_000_000L).toInt()
|
||||
modes.add(StreamCaptureMode(lens.cameraId, width, height, fps, lower, highSpeed, codec.name,
|
||||
video.bitrateRange.clamp(bitrate), type, video.bitrateRange.lower, video.bitrateRange.upper))
|
||||
LogManager.addLog("INFO", "video", "camera mode camera=${lens.cameraId} ${width}x$height fps=$lower..$fps " +
|
||||
"highSpeed=$highSpeed codec=${codec.name} bitrate=${modes.last().bitrate} achievable=${video.getAchievableFrameRatesFor(width, height)}")
|
||||
break
|
||||
} catch (e: Exception) { LogManager.addLog("WARN", "video", "codec probe ${codec.name}: ${e.message}") }
|
||||
}
|
||||
for (codec in codecs) {
|
||||
try {
|
||||
if (codec.supportedTypes.none { it.equals(type.mime, true) }) continue
|
||||
if (highSpeed && Build.VERSION.SDK_INT >= 29 && !codec.isHardwareAccelerated) continue
|
||||
val caps = codec.getCapabilitiesForType(type.mime)
|
||||
val video = caps.videoCapabilities
|
||||
if (!caps.colorFormats.contains(MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface) ||
|
||||
(type.profile != null && caps.profileLevels.none { it.profile == type.profile }) ||
|
||||
!video.areSizeAndRateSupported(width, height, fps.toDouble())) continue
|
||||
val bitrate = (width.toLong() * height * fps / 14).coerceIn(512_000L, 16_000_000L).toInt()
|
||||
modes.add(StreamCaptureMode(lens.cameraId, width, height, fps, lower, highSpeed, codec.name,
|
||||
video.bitrateRange.clamp(bitrate), type, video.bitrateRange.lower, video.bitrateRange.upper))
|
||||
LogManager.addLog("INFO", "video", "camera mode camera=${lens.cameraId} ${width}x$height fps=$lower..$fps " +
|
||||
"highSpeed=$highSpeed type=${type.label} encoder=${codec.name} bitrate=${modes.last().bitrate} " +
|
||||
"range=${video.bitrateRange} achievable=${video.getAchievableFrameRatesFor(width, height)}")
|
||||
break
|
||||
} catch (e: Exception) { LogManager.addLog("WARN", "video", "codec probe ${codec.name}: ${e.message}") }
|
||||
}
|
||||
}
|
||||
}
|
||||
val rates = c.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES).orEmpty()
|
||||
|
||||
Reference in new issue
Block a user