PortraitCameraView.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. package com.epson.cameracopy.device;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.graphics.ImageFormat;
  6. import android.graphics.Point;
  7. import android.graphics.SurfaceTexture;
  8. import android.hardware.Camera;
  9. import android.os.Build;
  10. import android.util.AttributeSet;
  11. import android.view.SurfaceHolder;
  12. import org.opencv.android.CameraBridgeViewBase;
  13. import org.opencv.core.Core;
  14. import org.opencv.core.CvType;
  15. import org.opencv.core.Mat;
  16. import org.opencv.imgproc.Imgproc;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import epson.common.ImageUtil;
  20. public class PortraitCameraView extends CameraBridgeViewBase implements Camera.PreviewCallback {
  21. @SuppressLint({"InlinedApi"})
  22. private static final String[] FAVORITE_FOCUS_MODES = {"continuous-video", "continuous-picture", "auto"};
  23. private static final int MAGIC_TEXTURE_ID = 10;
  24. private static final String TAG = "portCameraView";
  25. private byte[] mBuffer;
  26. protected Camera mCamera;
  27. protected JavaCameraFrame[] mCameraFrame;
  28. private boolean mCameraFrameReady = false;
  29. private int mChainIdx = 0;
  30. private Mat[] mFrameChain;
  31. private boolean mStopThread;
  32. private SurfaceTexture mSurfaceTexture;
  33. private Thread mThread;
  34. private boolean isInRange(double d, double d2, double d3) {
  35. return d - d2 <= d3 && d + d2 >= d3;
  36. }
  37. public static class JavaCameraSizeAccessor implements CameraBridgeViewBase.ListItemAccessor {
  38. public int getWidth(Object obj) {
  39. return ((Camera.Size) obj).width;
  40. }
  41. public int getHeight(Object obj) {
  42. return ((Camera.Size) obj).height;
  43. }
  44. }
  45. public PortraitCameraView(Context context, int i) {
  46. super(context, i);
  47. }
  48. public PortraitCameraView(Context context, AttributeSet attributeSet) {
  49. super(context, attributeSet);
  50. }
  51. public org.opencv.core.Size calculateCameraFrameSize(java.util.List<?> r19, org.opencv.android.CameraBridgeViewBase.ListItemAccessor r20, int r21, int r22) {
  52. throw new UnsupportedOperationException("Method not decompiled: com.epson.cameracopy.device.PortraitCameraView.calculateCameraFrameSize(java.util.List, org.opencv.android.CameraBridgeViewBase$ListItemAccessor, int, int):org.opencv.core.Size");
  53. }
  54. private Camera.Size selectPreviewSize(List<Camera.Size> list, double d) {
  55. Camera.Size size = null;
  56. double d2 = 0.0d;
  57. for (Camera.Size next : list) {
  58. if (Math.abs(((next.width) / (next.height)) - d) < 0.05d) {
  59. double d3 = ((next.width * next.height)) / 307200.0d;
  60. if (d3 > 1.0d) {
  61. d3 = 1.0d / d3;
  62. }
  63. if (d3 > d2) {
  64. size = next;
  65. d2 = d3;
  66. }
  67. }
  68. }
  69. return size;
  70. }
  71. protected boolean setPreviewSize(List<Camera.Size> list, Camera.Parameters parameters) {
  72. Point screenSize = getScreenSize();
  73. Camera.Size selectPreviewSize = selectPreviewSize(list, (screenSize.y) / (screenSize.x));
  74. if (selectPreviewSize == null) {
  75. return false;
  76. }
  77. parameters.setPreviewSize(selectPreviewSize.width, selectPreviewSize.height);
  78. return true;
  79. }
  80. private Point getScreenSize() {
  81. return ImageUtil.getDisplaySize(((Activity) getContext()).getWindowManager().getDefaultDisplay());
  82. }
  83. /* access modifiers changed from: protected */
  84. @SuppressLint({"NewApi"})
  85. public boolean initializeCamera(int i, int i2) {
  86. boolean z;
  87. Log.m52d(TAG, "Initialize java camera");
  88. synchronized (this) {
  89. mCamera = openBackCamera();
  90. z = false;
  91. if (mCamera == null) {
  92. return false;
  93. }
  94. try {
  95. Camera.Parameters parameters = mCamera.getParameters();
  96. Log.m52d(TAG, "getSupportedPreviewSizes()");
  97. List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
  98. if (supportedPreviewSizes != null) {
  99. parameters.setPreviewFormat(17);
  100. if (!setPictureAndPreviewResolutionManualMode(parameters)) {
  101. setPreviewSize(supportedPreviewSizes, parameters);
  102. setPictureSize(parameters.getPreviewSize(), parameters);
  103. }
  104. parameters.setJpegQuality(95);
  105. int i3 = Build.VERSION.SDK_INT;
  106. setForcusMode(parameters);
  107. parameters.setRotation(90);
  108. mCamera.setParameters(parameters);
  109. Camera.Parameters parameters2 = mCamera.getParameters();
  110. mFrameWidth = parameters2.getPreviewSize().height;
  111. mFrameHeight = parameters2.getPreviewSize().width;
  112. int i4 = mFrameHeight;
  113. int i5 = mFrameWidth;
  114. if (getLayoutParams().width == -1 && getLayoutParams().height == -1) {
  115. mScale = Math.min(((float) i2) / ((float) mFrameHeight), ((float) i) / ((float) mFrameWidth));
  116. } else {
  117. mScale = 0.0f;
  118. }
  119. if (mFpsMeter != null) {
  120. mFpsMeter.setResolution(mFrameWidth, mFrameHeight);
  121. }
  122. mBuffer = new byte[(((mFrameWidth * mFrameHeight) * ImageFormat.getBitsPerPixel(parameters2.getPreviewFormat())) / 8)];
  123. mCamera.addCallbackBuffer(mBuffer);
  124. mCamera.setPreviewCallbackWithBuffer(this);
  125. mFrameChain = new Mat[2];
  126. mFrameChain[0] = new Mat((i5 / 2) + i5, i4, CvType.CV_8UC1);
  127. mFrameChain[1] = new Mat(i5 + (i5 / 2), i4, CvType.CV_8UC1);
  128. AllocateCache();
  129. mCameraFrame = new JavaCameraFrame[2];
  130. mCameraFrame[0] = new JavaCameraFrame(mFrameChain[0], mFrameWidth, mFrameHeight);
  131. mCameraFrame[1] = new JavaCameraFrame(mFrameChain[1], mFrameWidth, mFrameHeight);
  132. if (Build.VERSION.SDK_INT >= 11) {
  133. mSurfaceTexture = new SurfaceTexture(10);
  134. mCamera.setPreviewTexture(mSurfaceTexture);
  135. } else {
  136. mCamera.setPreviewDisplay((SurfaceHolder) null);
  137. }
  138. Log.m52d(TAG, "startPreview");
  139. mCamera.startPreview();
  140. z = true;
  141. }
  142. } catch (Exception e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. return z;
  147. }
  148. private static Camera openBackCamera() {
  149. int numberOfCameras = Camera.getNumberOfCameras();
  150. Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
  151. Camera camera = null;
  152. boolean z = false;
  153. for (int i = 0; i < numberOfCameras; i++) {
  154. Camera.getCameraInfo(i, cameraInfo);
  155. if (cameraInfo.facing == 0) {
  156. try {
  157. camera = Camera.open(i);
  158. z = true;
  159. } catch (RuntimeException e) {
  160. Log.m53e(TAG, "Camera #" + i + "failed to open: " + e.getMessage());
  161. }
  162. if (z) {
  163. return camera;
  164. }
  165. }
  166. }
  167. return null;
  168. }
  169. public boolean checkBackCamera() {
  170. disconnectCamera();
  171. Camera openBackCamera = openBackCamera();
  172. if (openBackCamera == null) {
  173. return false;
  174. }
  175. openBackCamera.release();
  176. return true;
  177. }
  178. private void setForcusMode(Camera.Parameters parameters) {
  179. boolean autoPictureMode = CameraPreviewControl.getInstance(getContext()).getAutoPictureMode();
  180. List<String> supportedFocusModes = parameters.getSupportedFocusModes();
  181. if (supportedFocusModes != null) {
  182. if (autoPictureMode || !supportedFocusModes.contains("auto")) {
  183. for (String str : FAVORITE_FOCUS_MODES) {
  184. if (supportedFocusModes.contains(str)) {
  185. parameters.setFocusMode(str);
  186. return;
  187. }
  188. }
  189. return;
  190. }
  191. parameters.setFocusMode("auto");
  192. }
  193. }
  194. private Point OLDselectPreviewSizeFromPictureSize(double d, List<Camera.Size> list) {
  195. int i;
  196. if (list == null || list.size() <= 0 || d <= 0.0d) {
  197. return null;
  198. }
  199. Point point = new Point();
  200. for (Camera.Size next : list) {
  201. if (next.height * next.width >= 76800 && Math.abs(((next.width) / (next.height)) - d) < 0.05d && next.width > point.x) {
  202. point.x = next.width;
  203. point.y = next.height;
  204. }
  205. }
  206. if (point.x > 0) {
  207. return point;
  208. }
  209. int i2 = 0;
  210. Camera.Size size = list.get(0);
  211. point.x = size.width;
  212. point.y = size.height;
  213. double d2 = Double.MAX_VALUE;
  214. for (Camera.Size next2 : list) {
  215. if (next2.height > 0) {
  216. double abs = Math.abs(((next2.width) / (next2.height)) - d);
  217. if (d2 > abs + 0.05d) {
  218. i2 = next2.width * next2.height;
  219. point.x = next2.width;
  220. point.y = next2.height;
  221. d2 = abs;
  222. } else if (d2 > abs - 0.05d && i2 < (i = next2.width * next2.height)) {
  223. point.x = next2.width;
  224. point.y = next2.height;
  225. d2 = abs;
  226. i2 = i;
  227. }
  228. }
  229. }
  230. return point;
  231. }
  232. private SizeWrapper selectPreviewSizeFromPictureSize(double d, List<Camera.Size> list) {
  233. if (list == null || d <= 0.0d) {
  234. return null;
  235. }
  236. CameraSizeList cameraSizeList = new CameraSizeList(list);
  237. int height = getHeight();
  238. int width = getWidth();
  239. SizeWrapper selectSize01 = PreviewResolutionSelector.selectSize01(d, cameraSizeList, height, width);
  240. if (selectSize01 != null) {
  241. return selectSize01;
  242. }
  243. return PreviewResolutionSelector.selectSize02(d, cameraSizeList, height, width);
  244. }
  245. private boolean setPictureAndPreviewResolutionManualMode(Camera.Parameters parameters) {
  246. CameraPreviewControl instance = CameraPreviewControl.getInstance(getContext());
  247. if (instance.getPictureResolutionMode() != 1) {
  248. return false;
  249. }
  250. Point pictureSize = instance.getPictureSize();
  251. if (pictureSize.x <= 0 || pictureSize.y <= 0) {
  252. return false;
  253. }
  254. parameters.setPictureSize(pictureSize.x, pictureSize.y);
  255. SizeWrapper selectPreviewSizeFromPictureSize = selectPreviewSizeFromPictureSize((pictureSize.x) / (pictureSize.y), parameters.getSupportedPreviewSizes());
  256. if (selectPreviewSizeFromPictureSize != null) {
  257. parameters.setPreviewSize(selectPreviewSizeFromPictureSize.getWidth(), selectPreviewSizeFromPictureSize.getHeight());
  258. }
  259. return true;
  260. }
  261. static void setPictureSize(Camera.Size size, Camera.Parameters parameters) {
  262. Camera.Size pictureSize01 = setPictureSize01(parameters.getSupportedPictureSizes(), (size.width) / (size.height));
  263. if (pictureSize01 != null) {
  264. parameters.setPictureSize(pictureSize01.width, pictureSize01.height);
  265. } else {
  266. setPictureSize02(size, parameters);
  267. }
  268. }
  269. static Camera.Size setPictureSize01(List<Camera.Size> list, double d) {
  270. int i = 0;
  271. Camera.Size size = null;
  272. for (Camera.Size next : list) {
  273. if (Math.abs(((next.width) / (next.height)) - d) < 0.05d && i < next.width) {
  274. i = next.width;
  275. size = next;
  276. }
  277. }
  278. return size;
  279. }
  280. static void setPictureSize02(Camera.Size size, Camera.Parameters parameters) {
  281. List<Camera.Size> supportedPictureSizes = parameters.getSupportedPictureSizes();
  282. ArrayList arrayList = new ArrayList(supportedPictureSizes.size());
  283. for (Camera.Size next : supportedPictureSizes) {
  284. arrayList.add(new Point(next.width, next.height));
  285. }
  286. Point selectSize = selectSize(new Point(size.width, size.height), arrayList);
  287. if (selectSize != null) {
  288. parameters.setPictureSize(selectSize.x, selectSize.y);
  289. }
  290. }
  291. static Point selectSize(Point point, List<Point> list) {
  292. double d = (point.x) / (point.y);
  293. if (list == null) {
  294. return null;
  295. }
  296. double[] dArr = new double[list.size()];
  297. for (int i = 0; i < list.size(); i++) {
  298. Point point2 = list.get(i);
  299. dArr[i] = (point2.x) * (point2.y) * getRate(d, (point2.x) / (point2.y));
  300. }
  301. int maxIndex = getMaxIndex(dArr);
  302. if (maxIndex < 0 || maxIndex >= dArr.length) {
  303. return null;
  304. }
  305. return list.get(maxIndex);
  306. }
  307. static int getMaxIndex(double[] dArr) {
  308. if (dArr == null || dArr.length < 1) {
  309. return -1;
  310. }
  311. double d = dArr[0];
  312. int i = 0;
  313. for (int i2 = 0; i2 < dArr.length; i2++) {
  314. double d2 = dArr[i2];
  315. if (d < d2) {
  316. i = i2;
  317. d = d2;
  318. }
  319. }
  320. return i;
  321. }
  322. static double getRate(double d, double d2) {
  323. if (d <= 0.0d || d2 <= 0.0d) {
  324. return 1.0d;
  325. }
  326. double d3 = d2 / d;
  327. if (d3 > 1.0d) {
  328. d3 = 1.0d / d3;
  329. }
  330. return 1.0d / (Math.pow((d3 - 1.0d) * 10.0d, 2.0d) + 1.0d);
  331. }
  332. public Camera.Size getCameraPictureSize() {
  333. Camera camera = mCamera;
  334. if (camera == null) {
  335. return null;
  336. }
  337. try {
  338. Camera.Parameters parameters = camera.getParameters();
  339. if (parameters != null) {
  340. return parameters.getPictureSize();
  341. }
  342. return null;
  343. } catch (Exception unused) {
  344. return null;
  345. }
  346. }
  347. public List<Camera.Size> getPictureSizeList() {
  348. Camera camera = mCamera;
  349. if (camera == null) {
  350. return null;
  351. }
  352. try {
  353. Camera.Parameters parameters = camera.getParameters();
  354. if (parameters == null) {
  355. return null;
  356. }
  357. return parameters.getSupportedPictureSizes();
  358. } catch (Exception unused) {
  359. return null;
  360. }
  361. }
  362. protected void releaseCamera() {
  363. synchronized (this) {
  364. if (mCamera != null) {
  365. mCamera.stopPreview();
  366. mCamera.setPreviewCallback((Camera.PreviewCallback) null);
  367. mCamera.release();
  368. }
  369. mCamera = null;
  370. if (mFrameChain != null) {
  371. mFrameChain[0].release();
  372. mFrameChain[1].release();
  373. }
  374. if (mCameraFrame != null) {
  375. mCameraFrame[0].release();
  376. mCameraFrame[1].release();
  377. }
  378. }
  379. }
  380. protected boolean connectCamera(int i, int i2) {
  381. Log.m52d(TAG, "Connecting to camera");
  382. if (!initializeCamera(i, i2)) {
  383. return false;
  384. }
  385. mCameraFrameReady = false;
  386. Log.m52d(TAG, "Starting processing thread");
  387. mStopThread = false;
  388. mThread = new Thread(new CameraWorker(), "CameraWorker");
  389. mThread.start();
  390. return true;
  391. }
  392. protected void disconnectCamera() {
  393. Log.m52d(TAG, "Disconnecting from camera");
  394. try {
  395. mStopThread = true;
  396. Log.m52d(TAG, "Notify thread");
  397. synchronized (this) {
  398. notify();
  399. }
  400. Log.m52d(TAG, "Wating for thread");
  401. if (mThread != null) {
  402. mThread.join();
  403. }
  404. } catch (InterruptedException e) {
  405. try {
  406. e.printStackTrace();
  407. } catch (Throwable th) {
  408. mThread = null;
  409. throw th;
  410. }
  411. }
  412. mThread = null;
  413. releaseCamera();
  414. mCameraFrameReady = false;
  415. }
  416. public void onPreviewFrame(byte[] bArr, Camera camera) {
  417. synchronized (this) {
  418. mFrameChain[mChainIdx].put(0, 0, bArr);
  419. mCameraFrameReady = true;
  420. notify();
  421. }
  422. Camera camera2 = mCamera;
  423. if (camera2 != null) {
  424. camera2.addCallbackBuffer(mBuffer);
  425. }
  426. }
  427. private class JavaCameraFrame implements CameraBridgeViewBase.CvCameraViewFrame {
  428. private int mHeight;
  429. private Mat mRgba = new Mat();
  430. private Mat mRotated;
  431. private int mWidth;
  432. private Mat mYuvFrameData;
  433. public Mat gray() {
  434. Mat mat = mRotated;
  435. if (mat != null) {
  436. mat.release();
  437. }
  438. mRotated = mYuvFrameData.submat(0, mWidth, 0, mHeight);
  439. mRotated = mRotated.mo42753t();
  440. Mat mat2 = mRotated;
  441. Core.flip(mat2, mat2, 1);
  442. return mRotated;
  443. }
  444. public Mat rgba() {
  445. Imgproc.cvtColor(mYuvFrameData, mRgba, 96, 4);
  446. Mat mat = mRotated;
  447. if (mat != null) {
  448. mat.release();
  449. }
  450. mRotated = mRgba.mo42753t();
  451. Mat mat2 = mRotated;
  452. Core.flip(mat2, mat2, 1);
  453. return mRotated;
  454. }
  455. public JavaCameraFrame(Mat mat, int i, int i2) {
  456. mWidth = i;
  457. mHeight = i2;
  458. mYuvFrameData = mat;
  459. }
  460. public void release() {
  461. mRgba.release();
  462. Mat mat = mRotated;
  463. if (mat != null) {
  464. mat.release();
  465. }
  466. }
  467. }
  468. private class CameraWorker implements Runnable {
  469. private CameraWorker() {
  470. }
  471. public void run() {
  472. boolean z;
  473. do {
  474. synchronized (PortraitCameraView.this) {
  475. while (!PortraitCameraView.mCameraFrameReady && !PortraitCameraView.mStopThread) {
  476. try {
  477. wait();
  478. } catch (InterruptedException e) {
  479. e.printStackTrace();
  480. }
  481. }
  482. z = false;
  483. if (PortraitCameraView.mCameraFrameReady) {
  484. int unused = PortraitCameraView.mChainIdx = 1 - PortraitCameraView.mChainIdx;
  485. boolean unused2 = PortraitCameraView.mCameraFrameReady = false;
  486. z = true;
  487. }
  488. }
  489. if (!PortraitCameraView.mStopThread && z && !PortraitCameraView.mFrameChain[1 - PortraitCameraView.mChainIdx].empty()) {
  490. PortraitCameraView portraitCameraView = PortraitCameraView.this;
  491. portraitCameraView.deliverAndDrawFrame(portraitCameraView.mCameraFrame[1 - PortraitCameraView.mChainIdx]);
  492. }
  493. } while (!PortraitCameraView.mStopThread);
  494. Log.m52d(PortraitCameraView.TAG, "Finish processing thread");
  495. }
  496. }
  497. }