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;
14import java.io.ByteArrayOutputStream;
16class QtCameraListener
implements Camera.ShutterCallback,
17 Camera.PictureCallback,
18 Camera.AutoFocusCallback,
19 Camera.PreviewCallback
21 private static final String TAG =
"Qt Camera";
23 private static final int BUFFER_POOL_SIZE = 2;
25 private int m_cameraId = -1;
27 private boolean m_notifyNewFrames =
false;
28 private boolean m_notifyWhenFrameAvailable =
false;
29 private byte[][] m_previewBuffers =
null;
30 private byte[] m_lastPreviewBuffer =
null;
31 private Camera.Size m_previewSize =
null;
32 private int m_previewFormat = ImageFormat.NV21;
33 private int m_previewBytesPerLine = -1;
34 private int m_rotation = 0;
36 private QtCameraListener(
int id)
41 void notifyNewFrames(
boolean notify)
43 m_notifyNewFrames = notify;
46 void notifyWhenFrameAvailable(
boolean notify)
48 m_notifyWhenFrameAvailable = notify;
51 byte[] lastPreviewBuffer()
53 return m_lastPreviewBuffer;
58 if (m_previewSize ==
null)
61 return m_previewSize.width;
66 if (m_previewSize ==
null)
69 return m_previewSize.height;
74 return m_previewFormat;
77 int previewBytesPerLine()
79 return m_previewBytesPerLine;
82 void clearPreviewCallback(Camera
camera)
84 camera.setPreviewCallbackWithBuffer(
null);
87 void setPhotoRotation(
int rotation)
89 m_rotation = rotation;
92 void setupPreviewCallback(Camera
camera)
95 clearPreviewCallback(
camera);
96 m_lastPreviewBuffer =
null;
99 m_previewSize =
params.getPreviewSize();
100 m_previewFormat =
params.getPreviewFormat();
102 int bufferSizeNeeded = 0;
103 if (m_previewFormat == ImageFormat.YV12) {
105 final int yStride = (int) Math.ceil(m_previewSize.width / 16.0) * 16;
106 final int uvStride = (int) Math.ceil((yStride / 2) / 16.0) * 16;
107 final int ySize = yStride * m_previewSize.height;
108 final int uvSize = uvStride * m_previewSize.height / 2;
109 bufferSizeNeeded = ySize + uvSize * 2;
111 m_previewBytesPerLine = yStride;
114 double bytesPerPixel = ImageFormat.getBitsPerPixel(m_previewFormat) / 8.0;
115 bufferSizeNeeded = (int) Math.ceil(bytesPerPixel * m_previewSize.width * m_previewSize.height);
118 switch (m_previewFormat) {
119 case ImageFormat.NV21:
120 m_previewBytesPerLine = m_previewSize.width;
122 case ImageFormat.RGB_565:
123 case ImageFormat.YUY2:
124 m_previewBytesPerLine = m_previewSize.width * 2;
127 m_previewBytesPerLine = -1;
134 if (m_previewBuffers ==
null || m_previewBuffers[0].
length != bufferSizeNeeded)
135 m_previewBuffers =
new byte[BUFFER_POOL_SIZE][bufferSizeNeeded];
138 camera.setPreviewCallbackWithBuffer(
this);
139 for (
byte[]
buffer : m_previewBuffers)
144 public void onPreviewFrame(
byte[]
data, Camera
camera)
147 if (m_lastPreviewBuffer !=
null)
148 camera.addCallbackBuffer(m_lastPreviewBuffer);
150 m_lastPreviewBuffer =
data;
153 if (m_notifyWhenFrameAvailable) {
154 m_notifyWhenFrameAvailable =
false;
155 notifyFrameAvailable(m_cameraId);
157 if (m_notifyNewFrames) {
158 notifyNewPreviewFrame(m_cameraId,
data,
159 m_previewSize.width, m_previewSize.height,
161 m_previewBytesPerLine);
167 public void onShutter()
169 notifyPictureExposed(m_cameraId);
173 public void onPictureTaken(
byte[]
data, Camera
camera)
175 Camera.CameraInfo
info =
new Camera.CameraInfo();
176 Camera.getCameraInfo(m_cameraId,
info);
177 Bitmap
source = BitmapFactory.decodeByteArray(
data, 0,
data.length);
178 Matrix
matrix =
new Matrix();
179 matrix.postRotate(m_rotation);
180 if (
info.facing == CameraInfo.CAMERA_FACING_FRONT) {
183 Bitmap rotatedBitmap = Bitmap.createBitmap(
source, 0, 0,
source.getWidth(),
185 ByteArrayOutputStream outputStream =
new ByteArrayOutputStream();
186 rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
187 byte[] byteArray = outputStream.toByteArray();
188 rotatedBitmap.recycle();
190 notifyPictureCaptured(m_cameraId, byteArray);
194 public void onAutoFocus(
boolean success, Camera
camera)
196 notifyAutoFocusComplete(m_cameraId, success);
199 private static native
void notifyAutoFocusComplete(
int id,
boolean success);
200 private static native
void notifyPictureExposed(
int id);
201 private static native
void notifyPictureCaptured(
int id,
byte[]
data);
202 private static native
void notifyNewPreviewFrame(
int id,
byte[]
data,
int width,
int height,
203 int pixelFormat,
int bytesPerLine);
204 private static native
void notifyFrameAvailable(
int id);
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
[0]
GLenum GLuint GLenum GLsizei length
GLsizei GLsizei GLchar * source