blob: 93841dc9bfa8de2a5f67d9d94349ffb94824cb6a [file] [log] [blame]
/*
* Copyright (C) Texas Instruments - http://www.ti.com/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file CameraHal.cpp
*
* This file maps the Camera Hardware Interface to V4L2.
*
*/
#define LOG_TAG "****CameraHAL"
#include <utils/threads.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <utils/Log.h>
#include <utils/threads.h>
#include <linux/videodev2.h>
#include "binder/MemoryBase.h"
#include "binder/MemoryHeapBase.h"
#include <utils/threads.h>
#include <camera/CameraParameters.h>
#include <hardware/camera.h>
#include <sys/ioctl.h>
#include <utils/threads.h>
#include "CameraHardware.h"
#include <binder/MemoryBase.h>
#include <binder/MemoryHeapBase.h>
#include <utils/threads.h>
#include "V4L2Camera.h"
#define LOG_FUNCTION_NAME ALOGD("%d: %s() ENTER", __LINE__, __FUNCTION__);
using namespace android;
static CameraHardware *V4L2CameraHardware;
static int camera_device_open(const hw_module_t* module, const char* name,
hw_device_t** device);
static int camera_device_close(hw_device_t* device);
static int camera_get_number_of_cameras(void);
static int camera_get_camera_info(int camera_id, struct camera_info *info);
static struct hw_module_methods_t camera_module_methods = {
open: camera_device_open
};
camera_module_t HAL_MODULE_INFO_SYM = {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: CAMERA_HARDWARE_MODULE_ID,
name: "V4L2 CameraHal Module",
author: "Linaro",
methods: &camera_module_methods,
dso: NULL, /* remove compilation warnings */
reserved: {0}, /* remove compilation warnings */
},
get_number_of_cameras: camera_get_number_of_cameras,
get_camera_info: camera_get_camera_info,
};
typedef struct V4L2_camera_device {
camera_device_t base;
/* TI specific "private" data can go here (base.priv) */
int cameraid;
} V4l2_camera_device_t;
/*******************************************************************
* implementation of camera_device_ops functions
*******************************************************************/
int camera_set_preview_window(struct camera_device * device,
struct preview_stream_ops *window)
{
int rv = -EINVAL;
LOG_FUNCTION_NAME
if(!device)
return rv;
if(window==NULL)
{
ALOGW("window is NULL");
V4L2CameraHardware->setPreviewWindow(window);
return -1;
}
V4L2CameraHardware->setPreviewWindow(window);
ALOGD("Exiting the function");
return 0;
}
void camera_set_callbacks(struct camera_device * device,
camera_notify_callback notify_cb,
camera_data_callback data_cb,
camera_data_timestamp_callback data_cb_timestamp,
camera_request_memory get_memory,
void *user)
{
V4l2_camera_device_t* V4l2_dev = NULL;
LOG_FUNCTION_NAME
V4L2CameraHardware->setCallbacks(notify_cb,data_cb,data_cb_timestamp,get_memory,user);
}
void camera_enable_msg_type(struct camera_device * device, int32_t msg_type)
{
V4l2_camera_device_t* V4l2_dev = NULL;
LOG_FUNCTION_NAME
V4L2CameraHardware->enableMsgType(msg_type);
}
void camera_disable_msg_type(struct camera_device * device, int32_t msg_type)
{
V4l2_camera_device_t* V4l2_dev = NULL;
LOG_FUNCTION_NAME
V4L2CameraHardware->disableMsgType(msg_type);
}
int camera_msg_type_enabled(struct camera_device * device, int32_t msg_type)
{
V4l2_camera_device_t* V4l2_dev = NULL;
LOG_FUNCTION_NAME
return V4L2CameraHardware->msgTypeEnabled(msg_type);
}
int camera_start_preview(struct camera_device * device)
{
LOG_FUNCTION_NAME
return V4L2CameraHardware->startPreview();
}
void camera_stop_preview(struct camera_device * device)
{
LOG_FUNCTION_NAME
V4L2CameraHardware->stopPreview();
}
int camera_preview_enabled(struct camera_device * device)
{
LOG_FUNCTION_NAME
if(V4L2CameraHardware->previewEnabled())
{
ALOGW("----Preview Enabled----");
return 1;
}
else
{
ALOGW("----Preview not Enabled----");
return 0;
}
}
int camera_store_meta_data_in_buffers(struct camera_device * device, int enable)
{
int rv = -EINVAL;
LOG_FUNCTION_NAME
return rv;
}
int camera_start_recording(struct camera_device * device)
{
LOG_FUNCTION_NAME
return V4L2CameraHardware->startRecording();
}
void camera_stop_recording(struct camera_device * device)
{
LOG_FUNCTION_NAME
V4L2CameraHardware->stopRecording();
}
int camera_recording_enabled(struct camera_device * device)
{
LOG_FUNCTION_NAME
return V4L2CameraHardware->recordingEnabled();
}
void camera_release_recording_frame(struct camera_device * device,
const void *opaque)
{
LOG_FUNCTION_NAME
return V4L2CameraHardware->releaseRecordingFrame(opaque);
}
int camera_auto_focus(struct camera_device * device)
{
LOG_FUNCTION_NAME
return V4L2CameraHardware->autoFocus();
}
int camera_cancel_auto_focus(struct camera_device * device)
{
LOG_FUNCTION_NAME
return V4L2CameraHardware->cancelAutoFocus();
}
int camera_take_picture(struct camera_device * device)
{
LOG_FUNCTION_NAME
return V4L2CameraHardware->takePicture();
}
int camera_cancel_picture(struct camera_device * device)
{
int rv = 0;// -EINVAL;
LOG_FUNCTION_NAME
return V4L2CameraHardware->cancelPicture();
}
int camera_set_parameters(struct camera_device * device, const char *params)
{
LOG_FUNCTION_NAME
CameraParameters *camParams = new CameraParameters();
String8 *params_str8 = new String8(params);
camParams->unflatten(*params_str8);
return V4L2CameraHardware->setParameters(*camParams);
}
char* camera_get_parameters(struct camera_device * device)
{
char* param = NULL ;
#if 1
String8 params_str8 = V4L2CameraHardware->getParameters().flatten();
// camera service frees this string...
param = (char*) malloc(sizeof(char) * (params_str8.length()+1));
strcpy(param, params_str8.string());
ALOGD("%s",param);
#endif
LOG_FUNCTION_NAME
return param;
}
static void camera_put_parameters(struct camera_device *device, char *params)
{
LOG_FUNCTION_NAME
CameraParameters *camParams = new CameraParameters();
String8 *params_str8 = new String8(params);
camParams->unflatten(*params_str8);
V4L2CameraHardware->setParameters(*camParams);
}
int camera_send_command(struct camera_device * device,
int32_t cmd, int32_t arg1, int32_t arg2)
{
int rv =0;// -EINVAL;
LOG_FUNCTION_NAME
return rv;
}
void camera_release(struct camera_device * device)
{
LOG_FUNCTION_NAME
V4L2CameraHardware->release();
}
int camera_dump(struct camera_device * device, int fd)
{
int rv = 0;//-EINVAL;
LOG_FUNCTION_NAME
return rv;
}
extern "C" void heaptracker_free_leaked_memory(void);
int camera_device_close(hw_device_t* device)
{
int ret = 0;
LOG_FUNCTION_NAME
delete V4L2CameraHardware;
V4L2CameraHardware=NULL;
return ret;
}
/*******************************************************************
* implementation of camera_module functions
*******************************************************************/
/* open device handle to one of the cameras
*
* assume camera service will keep singleton of each camera
* so this function will always only be called once per camera instance
*/
int camera_device_open(const hw_module_t* module, const char* name,
hw_device_t** device)
{
int rv = 0;
int num_cameras = 1;
int cameraid;
V4l2_camera_device_t* camera_device = NULL;
camera_device_ops_t* camera_ops = NULL;
LOG_FUNCTION_NAME
ALOGI("camera_device open");
if (name != NULL) {
cameraid = atoi(name);
if(cameraid > num_cameras)
{
ALOGE("camera service provided cameraid out of bounds, "
"cameraid = %d, num supported = %d",
cameraid, num_cameras);
rv = -EINVAL;
goto fail;
}
camera_device = (V4l2_camera_device_t*)malloc(sizeof(*camera_device));
if(!camera_device)
{
ALOGE("camera_device allocation fail");
rv = -ENOMEM;
goto fail;
}
camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops));
if(!camera_ops)
{
ALOGE("camera_ops allocation fail");
rv = -ENOMEM;
goto fail;
}
memset(camera_device, 0, sizeof(*camera_device));
memset(camera_ops, 0, sizeof(*camera_ops));
camera_device->base.common.tag = HARDWARE_DEVICE_TAG;
camera_device->base.common.version = 0;
camera_device->base.common.module = (hw_module_t *)(module);
camera_device->base.common.close = camera_device_close;
camera_device->base.ops = camera_ops;
camera_ops->set_preview_window = camera_set_preview_window;
camera_ops->set_callbacks = camera_set_callbacks;
camera_ops->enable_msg_type = camera_enable_msg_type;
camera_ops->disable_msg_type = camera_disable_msg_type;
camera_ops->msg_type_enabled = camera_msg_type_enabled;
camera_ops->start_preview = camera_start_preview;
camera_ops->stop_preview = camera_stop_preview;
camera_ops->preview_enabled = camera_preview_enabled;
camera_ops->store_meta_data_in_buffers = camera_store_meta_data_in_buffers;
camera_ops->start_recording = camera_start_recording;
camera_ops->stop_recording = camera_stop_recording;
camera_ops->recording_enabled = camera_recording_enabled;
camera_ops->release_recording_frame = camera_release_recording_frame;
camera_ops->auto_focus = camera_auto_focus;
camera_ops->cancel_auto_focus = camera_cancel_auto_focus;
camera_ops->take_picture = camera_take_picture;
camera_ops->cancel_picture = camera_cancel_picture;
camera_ops->set_parameters = camera_set_parameters;
camera_ops->get_parameters = camera_get_parameters;
camera_ops->put_parameters = camera_put_parameters;
camera_ops->send_command = camera_send_command;
camera_ops->release = camera_release;
camera_ops->dump = camera_dump;
*device = &camera_device->base.common;
// -------- TI specific stuff --------
camera_device->cameraid = cameraid;
V4L2CameraHardware = new CameraHardware(0);
}
return rv;
fail:
if(camera_device) {
free(camera_device);
camera_device = NULL;
}
if(camera_ops) {
free(camera_ops);
camera_ops = NULL;
}
*device = NULL;
return rv;
}
int camera_get_number_of_cameras(void)
{
LOG_FUNCTION_NAME
int num_cameras =2;// MAX_CAMERAS_SUPPORTED;
return num_cameras;
}
int camera_get_camera_info(int camera_id, struct camera_info *info)
{
LOG_FUNCTION_NAME
int rv = 0;
int face_value = CAMERA_FACING_FRONT;
int orientation = 0;
const char *valstr = NULL;
if(camera_id == 0) {
info->facing = CAMERA_FACING_BACK;
ALOGD("cameraHal BACK %d",camera_id);
}
else {
ALOGD("cameraHal Front %d",camera_id);
info->facing = face_value;
}
info->orientation = orientation;
ALOGD("cameraHal %d",camera_id);
return rv;
}