4package org.qtproject.qt.android.multimedia;
6import android.content.Context;
7import android.graphics.Rect;
8import android.hardware.camera2.CameraCharacteristics;
9import android.hardware.camera2.CameraManager;
10import android.hardware.camera2.CaptureRequest;
11import android.hardware.camera2.params.StreamConfigurationMap;
12import android.media.MediaCodecList;
13import android.media.MediaCodecInfo;
14import android.os.Build;
15import android.util.Range;
16import android.util.Size;
18import java.lang.String;
19import java.util.ArrayList;
20import java.util.Arrays;
21import java.util.HashSet;
24import java.util.WeakHashMap;
26import org.qtproject.qt.android.UsedFromNativeCode;
28class QtVideoDeviceManager {
30 CameraManager mCameraManager;
35 mCameraManager = (CameraManager)
context.getSystemService(
Context.CAMERA_SERVICE);
36 cache =
new WeakHashMap<String, CameraCharacteristics>();
39 CameraCharacteristics getCameraCharacteristics(
String cameraId) {
41 if (cache.containsKey(cameraId))
42 return cache.get(cameraId);
45 CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics(cameraId);
46 cache.put(cameraId, cameraCharacteristics);
47 return cameraCharacteristics;
48 }
catch (Exception e) {
54 static private boolean isSoftwareCodec(
String longCodecName) {
55 longCodecName = longCodecName.toLowerCase();
56 return longCodecName.startsWith(
"omx.google.") || longCodecName.startsWith(
"c2.android.")
57 || !(longCodecName.startsWith(
"omx.") || longCodecName.startsWith(
"c2."));
64 static private String[] getHWVideoCodecs(
CODEC expectedType) {
65 MediaCodecList mediaCodecList =
new MediaCodecList(MediaCodecList.REGULAR_CODECS);
66 MediaCodecInfo[] mediaCodecInfo = mediaCodecList.getCodecInfos();
67 Set<String> codecs =
new HashSet<String>();
69 for (MediaCodecInfo codecInfo : mediaCodecInfo) {
71 if (currentType == expectedType && !isSoftwareCodec(codecInfo.getName())) {
72 String[] supportedTypes = codecInfo.getSupportedTypes();
74 if (
type.startsWith(
"video/"))
75 codecs.add(
type.substring(6));
79 return codecs.toArray(
new String[codecs.size()]);
82 static String[] getHWVideoDecoders() {
return getHWVideoCodecs(CODEC.DECODER); }
83 static String[] getHWVideoEncoders() {
return getHWVideoCodecs(CODEC.ENCODER); }
86 String[] getCameraIdList() {
88 return mCameraManager.getCameraIdList();
89 }
catch (Exception e) {
96 int getSensorOrientation(
String cameraId) {
97 CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
98 if (characteristics ==
null)
100 return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
105 int getLensFacing(
String cameraId) {
106 final CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
107 if (characteristics ==
null)
112 return characteristics.get(CameraCharacteristics.LENS_FACING);
118 CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
119 if (characteristics ==
null)
122 Range<Integer>[] ranges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
134 float[] getZoomRange(
String cameraId) {
136 float[] zoomRange = { 1.0f, 1.0f };
137 final CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
138 if (characteristics ==
null)
141 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
142 final Range<Float>
range = characteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE);
144 zoomRange[0] =
range.getLower();
145 zoomRange[1] =
range.getUpper();
149 if (zoomRange[1] == 1.0
f)
150 zoomRange[1] = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
157 final CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
158 if (characteristics !=
null)
159 activeArraySize = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
160 return activeArraySize;
163 static final int maxResolution = 3840*2160;
165 String[] getStreamConfigurationsSizes(
String cameraId,
int imageFormat) {
167 CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
168 if (characteristics ==
null)
171 StreamConfigurationMap
map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
176 ArrayList<String>
stream =
new ArrayList<>();
189 return CaptureRequest.CONTROL_AE_MODE_ON;
191 return CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH;
193 return CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH;
195 return CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
197 return CaptureRequest.CONTROL_AE_MODE_ON_EXTERNAL_FLASH;
205 case CaptureRequest.CONTROL_AE_MODE_ON:
207 case CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH:
209 case CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH:
211 case CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
213 case CaptureRequest.CONTROL_AE_MODE_ON_EXTERNAL_FLASH:
215 case CaptureRequest.CONTROL_AE_MODE_OFF:
226 int[] getAllAvailableAfModes(
String cameraId) {
227 if (cameraId.isEmpty())
230 CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
231 if (characteristics ==
null)
234 final int[] characteristicsValue = characteristics.get(
235 CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
236 return characteristicsValue !=
null ? characteristicsValue :
new int[0];
239 boolean isAfModeAvailable(
String cameraId,
int afMode) {
240 if (cameraId ==
null || cameraId.isEmpty())
243 .stream(getAllAvailableAfModes(cameraId))
254 String[] getSupportedQCameraFocusModesAsStrings(
String cameraId) {
255 ArrayList<String> outList =
new ArrayList<String>();
258 if (isAfModeAvailable(cameraId, CameraCharacteristics.CONTROL_AF_MODE_CONTINUOUS_PICTURE)) {
259 outList.add(
"FocusModeAuto");
262 if (isAfModeAvailable(cameraId, CameraCharacteristics.CONTROL_AF_MODE_OFF)
263 && isManualFocusDistanceSupported(cameraId))
264 outList.add(
"FocusModeManual");
267 return outList.toArray(
ret);
273 CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
274 if (characteristics ==
null)
277 int supportedFlashModes[] = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
278 ArrayList<String> supportedFlashModesList =
new ArrayList<String>();
280 supportedFlashModesList.add(controlAEModeToString(supportedFlashModes[
index]));
284 return supportedFlashModesList.toArray(
ret);
291 float getLensInfoMinimumFocusDistance(
String cameraId) {
292 final CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
293 if (characteristics ==
null)
296 CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
308 boolean isManualFocusDistanceSupported(
String cameraId) {
309 return getLensInfoMinimumFocusDistance(cameraId) > 0;
312 static boolean isEmulator()
314 return ((Build.BRAND.startsWith(
"generic") && Build.DEVICE.startsWith(
"generic"))
315 || Build.FINGERPRINT.startsWith(
"generic")
316 || Build.FINGERPRINT.startsWith(
"unknown")
317 || Build.HARDWARE.contains(
"goldfish")
318 || Build.HARDWARE.contains(
"ranchu")
319 || Build.MODEL.contains(
"google_sdk")
320 || Build.MODEL.contains(
"Emulator")
321 || Build.MODEL.contains(
"Android SDK built for x86")
322 || Build.MANUFACTURER.contains(
"Genymotion")
323 || Build.PRODUCT.contains(
"sdk")
324 || Build.PRODUCT.contains(
"vbox86p")
325 || Build.PRODUCT.contains(
"emulator")
326 || Build.PRODUCT.contains(
"simulator"));
330 boolean isTorchModeSupported(
String cameraId) {
332 final CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
333 if (characteristics !=
null)
334 ret = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
static const QString context()
QFuture< void > map(QThreadPool *pool, Sequence &&sequence, MapFunctor &&map)
Calls function once for each item in sequence.
EGLOutputLayerEXT EGLint EGLAttrib value
[3]
GLuint GLsizei const GLuint const GLintptr const GLsizeiptr * sizes
QList< std::pair< QString, QString > > Map
char * toString(const MyType &t)
[31]