This commit is contained in:
twinaphex 2016-09-08 13:29:50 +02:00
parent bc5c7571b5
commit cbba2f593f
2 changed files with 44 additions and 48 deletions

View File

@ -33,8 +33,11 @@ typedef struct android_camera
static void *android_camera_init(const char *device, uint64_t caps, static void *android_camera_init(const char *device, uint64_t caps,
unsigned width, unsigned height) unsigned width, unsigned height)
{ {
JNIEnv *env;
jclass class; jclass class;
androidcamera_t *androidcamera = NULL;
JNIEnv *env = NULL;
struct android_app *android_app = (struct android_app*)g_android;
(void)device; (void)device;
(void)width; (void)width;
(void)height; (void)height;
@ -45,9 +48,7 @@ static void *android_camera_init(const char *device, uint64_t caps,
return NULL; return NULL;
} }
struct android_app *android_app = (struct android_app*)g_android; androidcamera = (androidcamera_t*)calloc(1, sizeof(androidcamera_t));
androidcamera_t *androidcamera = (androidcamera_t*)
calloc(1, sizeof(androidcamera_t));
if (!androidcamera) if (!androidcamera)
return NULL; return NULL;
@ -102,8 +103,9 @@ dealloc:
static void android_camera_free(void *data) static void android_camera_free(void *data)
{ {
struct android_app *android_app = (struct android_app*)g_android; struct android_app *android_app = (struct android_app*)g_android;
androidcamera_t *androidcamera = (androidcamera_t*)data; androidcamera_t *androidcamera = (androidcamera_t*)data;
JNIEnv *env = jni_thread_getenv(); JNIEnv *env = jni_thread_getenv();
if (!env) if (!env)
return; return;
@ -116,8 +118,9 @@ static void android_camera_free(void *data)
static bool android_camera_start(void *data) static bool android_camera_start(void *data)
{ {
struct android_app *android_app = (struct android_app*)g_android; struct android_app *android_app = (struct android_app*)g_android;
androidcamera_t *androidcamera = (androidcamera_t*)data; androidcamera_t *androidcamera = (androidcamera_t*)data;
JNIEnv *env = jni_thread_getenv(); JNIEnv *env = jni_thread_getenv();
if (!env) if (!env)
return NULL; return NULL;
@ -141,8 +144,9 @@ static bool android_camera_start(void *data)
static void android_camera_stop(void *data) static void android_camera_stop(void *data)
{ {
struct android_app *android_app = (struct android_app*)g_android; struct android_app *android_app = (struct android_app*)g_android;
androidcamera_t *androidcamera = (androidcamera_t*)data; androidcamera_t *androidcamera = (androidcamera_t*)data;
JNIEnv *env = jni_thread_getenv(); JNIEnv *env = jni_thread_getenv();
if (!env) if (!env)
return; return;
@ -157,15 +161,16 @@ static bool android_camera_poll(void *data,
retro_camera_frame_raw_framebuffer_t frame_raw_cb, retro_camera_frame_raw_framebuffer_t frame_raw_cb,
retro_camera_frame_opengl_texture_t frame_gl_cb) retro_camera_frame_opengl_texture_t frame_gl_cb)
{ {
jboolean newFrame;
struct android_app *android_app = (struct android_app*)g_android; struct android_app *android_app = (struct android_app*)g_android;
androidcamera_t *androidcamera = (androidcamera_t*)data; androidcamera_t *androidcamera = (androidcamera_t*)data;
JNIEnv *env = jni_thread_getenv(); JNIEnv *env = jni_thread_getenv();
if (!env) if (!env)
return NULL; return NULL;
(void)frame_raw_cb; (void)frame_raw_cb;
jboolean newFrame;
CALL_BOOLEAN_METHOD(env, newFrame, android_app->activity->clazz, CALL_BOOLEAN_METHOD(env, newFrame, android_app->activity->clazz,
androidcamera->onCameraPoll); androidcamera->onCameraPoll);

View File

@ -90,14 +90,12 @@ static int xioctl(int fd, int request, void *args)
static bool init_mmap(void *data) static bool init_mmap(void *data)
{ {
struct v4l2_requestbuffers req; struct v4l2_requestbuffers req = {0};
video4linux_t *v4l = (video4linux_t*)data; video4linux_t *v4l = (video4linux_t*)data;
memset(&req, 0, sizeof(req)); req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.count = 4; req.memory = V4L2_MEMORY_MMAP;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if (xioctl(v4l->fd, (uint8_t)VIDIOC_REQBUFS, &req) == -1) if (xioctl(v4l->fd, (uint8_t)VIDIOC_REQBUFS, &req) == -1)
{ {
@ -124,13 +122,11 @@ static bool init_mmap(void *data)
for (v4l->n_buffers = 0; v4l->n_buffers < req.count; v4l->n_buffers++) for (v4l->n_buffers = 0; v4l->n_buffers < req.count; v4l->n_buffers++)
{ {
struct v4l2_buffer buf; struct v4l2_buffer buf = {0};
memset(&buf, 0, sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP; buf.memory = V4L2_MEMORY_MMAP;
buf.index = v4l->n_buffers; buf.index = v4l->n_buffers;
if (xioctl(v4l->fd, (uint8_t)VIDIOC_QUERYBUF, &buf) == -1) if (xioctl(v4l->fd, (uint8_t)VIDIOC_QUERYBUF, &buf) == -1)
{ {
@ -139,7 +135,7 @@ static bool init_mmap(void *data)
} }
v4l->buffers[v4l->n_buffers].length = buf.length; v4l->buffers[v4l->n_buffers].length = buf.length;
v4l->buffers[v4l->n_buffers].start = mmap(NULL, v4l->buffers[v4l->n_buffers].start = mmap(NULL,
buf.length, PROT_READ | PROT_WRITE, buf.length, PROT_READ | PROT_WRITE,
MAP_SHARED, MAP_SHARED,
v4l->fd, buf.m.offset); v4l->fd, buf.m.offset);
@ -156,11 +152,11 @@ static bool init_mmap(void *data)
static bool init_device(void *data) static bool init_device(void *data)
{ {
struct v4l2_capability cap;
struct v4l2_cropcap cropcap;
struct v4l2_crop crop; struct v4l2_crop crop;
struct v4l2_format fmt; struct v4l2_capability cap;
video4linux_t *v4l = (video4linux_t*)data; struct v4l2_format fmt = {0};
struct v4l2_cropcap cropcap = {0};
video4linux_t *v4l = (video4linux_t*)data;
if (xioctl(v4l->fd, (uint8_t)VIDIOC_QUERYCAP, &cap) < 0) if (xioctl(v4l->fd, (uint8_t)VIDIOC_QUERYCAP, &cap) < 0)
{ {
@ -184,24 +180,21 @@ static bool init_device(void *data)
return false; return false;
} }
memset(&cropcap, 0, sizeof(cropcap));
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (xioctl(v4l->fd, (uint8_t)VIDIOC_CROPCAP, &cropcap) == 0) if (xioctl(v4l->fd, (uint8_t)VIDIOC_CROPCAP, &cropcap) == 0)
{ {
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c = cropcap.defrect; crop.c = cropcap.defrect;
/* Ignore errors here. */ /* Ignore errors here. */
xioctl(v4l->fd, VIDIOC_S_CROP, &crop); xioctl(v4l->fd, VIDIOC_S_CROP, &crop);
} }
memset(&fmt, 0, sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = v4l->width;
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.height = v4l->height;
fmt.fmt.pix.width = v4l->width;
fmt.fmt.pix.height = v4l->height;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_NONE; fmt.fmt.pix.field = V4L2_FIELD_NONE;
if (xioctl(v4l->fd, (uint8_t)VIDIOC_S_FMT, &fmt) < 0) if (xioctl(v4l->fd, (uint8_t)VIDIOC_S_FMT, &fmt) < 0)
{ {
@ -255,9 +248,7 @@ static bool v4l_start(void *data)
for (i = 0; i < v4l->n_buffers; i++) for (i = 0; i < v4l->n_buffers; i++)
{ {
struct v4l2_buffer buf; struct v4l2_buffer buf = {0};
memset(&buf, 0, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP; buf.memory = V4L2_MEMORY_MMAP;
@ -372,12 +363,10 @@ error:
static bool preprocess_image(void *data) static bool preprocess_image(void *data)
{ {
video4linux_t *v4l = (video4linux_t*)data; video4linux_t *v4l = (video4linux_t*)data;
struct v4l2_buffer buf; struct v4l2_buffer buf = {0};
memset(&buf, 0, sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP; buf.memory = V4L2_MEMORY_MMAP;
if (xioctl(v4l->fd, (uint8_t)VIDIOC_DQBUF, &buf) == -1) if (xioctl(v4l->fd, (uint8_t)VIDIOC_DQBUF, &buf) == -1)
@ -385,11 +374,13 @@ static bool preprocess_image(void *data)
switch (errno) switch (errno)
{ {
case EAGAIN: case EAGAIN:
return false; break;
default: default:
RARCH_ERR("VIDIOC_DQBUF.\n"); RARCH_ERR("VIDIOC_DQBUF.\n");
return false; break;
} }
return false;
} }
retro_assert(buf.index < v4l->n_buffers); retro_assert(buf.index < v4l->n_buffers);