summaryrefslogtreecommitdiff
path: root/libcamera/CameraHal_Module.cpp
blob: d322673bc2232f1fba4ccc45c5b7162a39f9ac55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
/*
 * 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           LOGD("%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)
    {
        LOGW("window is NULL");
        V4L2CameraHardware->setPreviewWindow(window);
     return -1; 
    }

        V4L2CameraHardware->setPreviewWindow(window);
    LOGD("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())
    {
        LOGW("----Preview Enabled----");
        return 1;
    }
    else
    {
        LOGW("----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());
    LOGD("%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


    LOGI("camera_device open");

    if (name != NULL) {
        cameraid = atoi(name);

        if(cameraid > num_cameras)
        {
            LOGE("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)
        {
            LOGE("camera_device allocation fail");
            rv = -ENOMEM;
            goto fail;
        }

        camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops));
        if(!camera_ops)
        {
            LOGE("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;
    LOGD("cameraHal BACK %d",camera_id);
    }
    else {
    LOGD("cameraHal Front %d",camera_id);
    info->facing = face_value;
    }
    info->orientation = orientation;
    LOGD("cameraHal %d",camera_id);
    return rv;
}