4package org.qtproject.qt.android.multimedia;
6import android.hardware.Camera;
7import android.hardware.Camera.CameraInfo;
9import android.graphics.Bitmap;
10import android.graphics.BitmapFactory;
11import android.graphics.ImageFormat;
12import android.graphics.Matrix;
13import android.graphics.SurfaceTexture;
14import android.util.Log;
16import java.io.ByteArrayOutputStream;
19 Camera.PictureCallback,
20 Camera.AutoFocusCallback,
21 Camera.PreviewCallback
23 private static final String TAG =
"Qt Camera";
25 private static final int BUFFER_POOL_SIZE = 2;
27 private int m_cameraId = -1;
29 private boolean m_notifyNewFrames =
false;
30 private boolean m_notifyWhenFrameAvailable =
false;
31 private byte[][] m_previewBuffers =
null;
32 private byte[] m_lastPreviewBuffer =
null;
33 private Camera.Size m_previewSize =
null;
34 private int m_previewFormat = ImageFormat.NV21;
35 private int m_previewBytesPerLine = -1;
36 private int m_rotation = 0;
45 m_notifyNewFrames = notify;
50 m_notifyWhenFrameAvailable = notify;
55 return m_lastPreviewBuffer;
60 if (m_previewSize ==
null)
63 return m_previewSize.width;
68 if (m_previewSize ==
null)
71 return m_previewSize.height;
76 return m_previewFormat;
81 return m_previewBytesPerLine;
86 camera.setPreviewCallbackWithBuffer(
null);
91 m_rotation = rotation;
98 m_lastPreviewBuffer =
null;
100 final Camera.Parameters
params =
camera.getParameters();
101 m_previewSize =
params.getPreviewSize();
102 m_previewFormat =
params.getPreviewFormat();
104 int bufferSizeNeeded = 0;
105 if (m_previewFormat == ImageFormat.YV12) {
107 final int yStride = (int) Math.ceil(m_previewSize.width / 16.0) * 16;
108 final int uvStride = (int) Math.ceil((yStride / 2) / 16.0) * 16;
109 final int ySize = yStride * m_previewSize.height;
110 final int uvSize = uvStride * m_previewSize.height / 2;
111 bufferSizeNeeded = ySize + uvSize * 2;
113 m_previewBytesPerLine = yStride;
116 double bytesPerPixel = ImageFormat.getBitsPerPixel(m_previewFormat) / 8.0;
117 bufferSizeNeeded = (int) Math.ceil(bytesPerPixel * m_previewSize.width * m_previewSize.height);
120 switch (m_previewFormat) {
121 case ImageFormat.NV21:
122 m_previewBytesPerLine = m_previewSize.width;
124 case ImageFormat.RGB_565:
125 case ImageFormat.YUY2:
126 m_previewBytesPerLine = m_previewSize.width * 2;
129 m_previewBytesPerLine = -1;
136 if (m_previewBuffers ==
null || m_previewBuffers[0].
length != bufferSizeNeeded)
137 m_previewBuffers =
new byte[BUFFER_POOL_SIZE][bufferSizeNeeded];
140 camera.setPreviewCallbackWithBuffer(
this);
141 for (
byte[]
buffer : m_previewBuffers)
149 if (m_lastPreviewBuffer !=
null)
150 camera.addCallbackBuffer(m_lastPreviewBuffer);
152 m_lastPreviewBuffer =
data;
155 if (m_notifyWhenFrameAvailable) {
156 m_notifyWhenFrameAvailable =
false;
157 notifyFrameAvailable(m_cameraId);
159 if (m_notifyNewFrames) {
160 notifyNewPreviewFrame(m_cameraId,
data,
161 m_previewSize.width, m_previewSize.height,
163 m_previewBytesPerLine);
171 notifyPictureExposed(m_cameraId);
177 Camera.CameraInfo
info =
new Camera.CameraInfo();
178 Camera.getCameraInfo(m_cameraId,
info);
179 Bitmap
source = BitmapFactory.decodeByteArray(
data, 0,
data.length);
180 Matrix
matrix =
new Matrix();
181 matrix.postRotate(m_rotation);
182 if (
info.facing == CameraInfo.CAMERA_FACING_FRONT) {
185 Bitmap rotatedBitmap = Bitmap.createBitmap(
source, 0, 0,
source.getWidth(),
187 ByteArrayOutputStream outputStream =
new ByteArrayOutputStream();
188 rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
189 byte[] byteArray = outputStream.toByteArray();
190 rotatedBitmap.recycle();
192 notifyPictureCaptured(m_cameraId, byteArray);
198 notifyAutoFocusComplete(m_cameraId, success);
201 private static native
void notifyAutoFocusComplete(
int id,
boolean success);
202 private static native
void notifyPictureExposed(
int id);
203 private static native
void notifyPictureCaptured(
int id,
byte[]
data);
204 private static native
void notifyNewPreviewFrame(
int id,
byte[]
data,
int width,
int height,
205 int pixelFormat,
int bytesPerLine);
206 private static native
void notifyFrameAvailable(
int id);
GLint GLsizei GLsizei height
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLsizei GLsizei GLchar * source