• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2008, The Android Open Source Project
4 ** Copyright 2010, Samsung Electronics Co. LTD
5 **
6 ** Licensed under the Apache License, Version 2.0 (the "License");
7 ** you may not use this file except in compliance with the License.
8 ** You may obtain a copy of the License at
9 **
10 **     http://www.apache.org/licenses/LICENSE-2.0
11 **
12 ** Unless required by applicable law or agreed to in writing, software
13 ** distributed under the License is distributed on an "AS IS" BASIS,
14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 ** See the License for the specific language governing permissions and
16 ** limitations under the License.
17 */
18 
19 #ifndef ANDROID_HARDWARE_CAMERA_SEC_H
20 #define ANDROID_HARDWARE_CAMERA_SEC_H
21 
22 #include <stdio.h>
23 #include <string.h>
24 #include <stdlib.h>
25 
26 #include <fcntl.h>
27 #include <unistd.h>
28 #include <errno.h>
29 #include <signal.h>
30 #include <sys/mman.h>
31 #include <sys/time.h>
32 #include <sys/ioctl.h>
33 #include <sys/poll.h>
34 #include <sys/stat.h>
35 
36 #include <utils/RefBase.h>
37 #include <linux/videodev2.h>
38 #include <videodev2_samsung.h>
39 
40 #include <utils/String8.h>
41 
42 #include "JpegEncoder.h"
43 
44 namespace android {
45 
46 #define ENABLE_ESD_PREVIEW_CHECK
47 
48 #if defined(LOG_NDEBUG) && LOG_NDEBUG == 0
49 #define LOG_CAMERA ALOGD
50 #define LOG_CAMERA_PREVIEW ALOGD
51 
52 #define LOG_TIME_DEFINE(n) \
53     struct timeval time_start_##n, time_stop_##n; unsigned long log_time_##n = 0;
54 
55 #define LOG_TIME_START(n) \
56     gettimeofday(&time_start_##n, NULL);
57 
58 #define LOG_TIME_END(n) \
59     gettimeofday(&time_stop_##n, NULL); log_time_##n = measure_time(&time_start_##n, &time_stop_##n);
60 
61 #define LOG_TIME(n) \
62     log_time_##n
63 
64 #else
65 #define LOG_CAMERA(...)
66 #define LOG_CAMERA_PREVIEW(...)
67 #define LOG_TIME_DEFINE(n)
68 #define LOG_TIME_START(n)
69 #define LOG_TIME_END(n)
70 #define LOG_TIME(n)
71 #endif
72 
73 #define JOIN(x, y) JOIN_AGAIN(x, y)
74 #define JOIN_AGAIN(x, y) x ## y
75 
76 #define FRONT_CAM VGA
77 #define BACK_CAM S5K4ECGX
78 
79 #if !defined (FRONT_CAM) || !defined(BACK_CAM)
80 #error "Please define the Camera module"
81 #endif
82 
83 #define S5K4ECGX_PREVIEW_WIDTH            720
84 #define S5K4ECGX_PREVIEW_HEIGHT           480
85 #define S5K4ECGX_SNAPSHOT_WIDTH           2560
86 #define S5K4ECGX_SNAPSHOT_HEIGHT          1920
87 
88 #define S5K4ECGX_POSTVIEW_WIDTH           640
89 #define S5K4ECGX_POSTVIEW_WIDE_WIDTH      800
90 #define S5K4ECGX_POSTVIEW_HEIGHT          480
91 #define S5K4ECGX_POSTVIEW_BPP             16
92 
93 #define S5K4ECGX_THUMBNAIL_WIDTH          320
94 #define S5K4ECGX_THUMBNAIL_HEIGHT         240
95 #define S5K4ECGX_THUMBNAIL_BPP            16
96 
97 /* focal length of 3.43mm */
98 #define S5K4ECGX_FOCAL_LENGTH             343
99 
100 #define VGA_PREVIEW_WIDTH               640
101 #define VGA_PREVIEW_HEIGHT              480
102 #define VGA_SNAPSHOT_WIDTH              640
103 #define VGA_SNAPSHOT_HEIGHT             480
104 
105 #define VGA_THUMBNAIL_WIDTH             160
106 #define VGA_THUMBNAIL_HEIGHT            120
107 #define VGA_THUMBNAIL_BPP               16
108 
109 /* focal length of 0.9mm */
110 #define VGA_FOCAL_LENGTH                90
111 
112 #define MAX_BACK_CAMERA_PREVIEW_WIDTH       JOIN(BACK_CAM,_PREVIEW_WIDTH)
113 #define MAX_BACK_CAMERA_PREVIEW_HEIGHT      JOIN(BACK_CAM,_PREVIEW_HEIGHT)
114 #define MAX_BACK_CAMERA_SNAPSHOT_WIDTH      JOIN(BACK_CAM,_SNAPSHOT_WIDTH)
115 #define MAX_BACK_CAMERA_SNAPSHOT_HEIGHT     JOIN(BACK_CAM,_SNAPSHOT_HEIGHT)
116 #define BACK_CAMERA_POSTVIEW_WIDTH          JOIN(BACK_CAM,_POSTVIEW_WIDTH)
117 #define BACK_CAMERA_POSTVIEW_WIDE_WIDTH     JOIN(BACK_CAM,_POSTVIEW_WIDE_WIDTH)
118 #define BACK_CAMERA_POSTVIEW_HEIGHT         JOIN(BACK_CAM,_POSTVIEW_HEIGHT)
119 #define BACK_CAMERA_POSTVIEW_BPP            JOIN(BACK_CAM,_POSTVIEW_BPP)
120 #define BACK_CAMERA_THUMBNAIL_WIDTH         JOIN(BACK_CAM,_THUMBNAIL_WIDTH)
121 #define BACK_CAMERA_THUMBNAIL_HEIGHT        JOIN(BACK_CAM,_THUMBNAIL_HEIGHT)
122 #define BACK_CAMERA_THUMBNAIL_BPP           JOIN(BACK_CAM,_THUMBNAIL_BPP)
123 
124 #define BACK_CAMERA_FOCAL_LENGTH            JOIN(BACK_CAM,_FOCAL_LENGTH)
125 
126 #define MAX_FRONT_CAMERA_PREVIEW_WIDTH      JOIN(FRONT_CAM,_PREVIEW_WIDTH)
127 #define MAX_FRONT_CAMERA_PREVIEW_HEIGHT     JOIN(FRONT_CAM,_PREVIEW_HEIGHT)
128 #define MAX_FRONT_CAMERA_SNAPSHOT_WIDTH     JOIN(FRONT_CAM,_SNAPSHOT_WIDTH)
129 #define MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT    JOIN(FRONT_CAM,_SNAPSHOT_HEIGHT)
130 
131 #define FRONT_CAMERA_THUMBNAIL_WIDTH        JOIN(FRONT_CAM,_THUMBNAIL_WIDTH)
132 #define FRONT_CAMERA_THUMBNAIL_HEIGHT       JOIN(FRONT_CAM,_THUMBNAIL_HEIGHT)
133 #define FRONT_CAMERA_THUMBNAIL_BPP          JOIN(FRONT_CAM,_THUMBNAIL_BPP)
134 #define FRONT_CAMERA_FOCAL_LENGTH           JOIN(FRONT_CAM,_FOCAL_LENGTH)
135 
136 #define DEFAULT_JPEG_THUMBNAIL_WIDTH        256
137 #define DEFAULT_JPEG_THUMBNAIL_HEIGHT       192
138 
139 #define CAMERA_DEV_NAME   "/dev/video0"
140 #define CAMERA_DEV_NAME2  "/dev/video2"
141 
142 #define CAMERA_DEV_NAME_TEMP "/data/videotmp_000"
143 #define CAMERA_DEV_NAME2_TEMP "/data/videotemp_002"
144 
145 
146 #define BPP             2
147 #define MIN(x, y)       (((x) < (y)) ? (x) : (y))
148 #define MAX_BUFFERS     9 // 11
149 
150 #define FIRST_AF_SEARCH_COUNT 80
151 #define SECOND_AF_SEARCH_COUNT 80
152 #define AF_PROGRESS 0x01
153 #define AF_SUCCESS 0x02
154 #define AF_DELAY 50000
155 
156 /*
157  * V 4 L 2   F I M C   E X T E N S I O N S
158  *
159  */
160 #define V4L2_CID_ROTATION                   (V4L2_CID_PRIVATE_BASE + 0)
161 #define V4L2_CID_PADDR_Y                    (V4L2_CID_PRIVATE_BASE + 1)
162 #define V4L2_CID_PADDR_CB                   (V4L2_CID_PRIVATE_BASE + 2)
163 #define V4L2_CID_PADDR_CR                   (V4L2_CID_PRIVATE_BASE + 3)
164 #define V4L2_CID_PADDR_CBCR                 (V4L2_CID_PRIVATE_BASE + 4)
165 #define V4L2_CID_STREAM_PAUSE               (V4L2_CID_PRIVATE_BASE + 53)
166 
167 #define V4L2_CID_CAM_JPEG_MAIN_SIZE         (V4L2_CID_PRIVATE_BASE + 32)
168 #define V4L2_CID_CAM_JPEG_MAIN_OFFSET       (V4L2_CID_PRIVATE_BASE + 33)
169 #define V4L2_CID_CAM_JPEG_THUMB_SIZE        (V4L2_CID_PRIVATE_BASE + 34)
170 #define V4L2_CID_CAM_JPEG_THUMB_OFFSET      (V4L2_CID_PRIVATE_BASE + 35)
171 #define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET   (V4L2_CID_PRIVATE_BASE + 36)
172 #define V4L2_CID_CAM_JPEG_QUALITY           (V4L2_CID_PRIVATE_BASE + 37)
173 
174 #define TPATTERN_COLORBAR           1
175 #define TPATTERN_HORIZONTAL         2
176 #define TPATTERN_VERTICAL           3
177 
178 #define V4L2_PIX_FMT_YVYU           v4l2_fourcc('Y', 'V', 'Y', 'U')
179 
180 /* FOURCC for FIMC specific */
181 #define V4L2_PIX_FMT_VYUY           v4l2_fourcc('V', 'Y', 'U', 'Y')
182 #define V4L2_PIX_FMT_NV16           v4l2_fourcc('N', 'V', '1', '6')
183 #define V4L2_PIX_FMT_NV61           v4l2_fourcc('N', 'V', '6', '1')
184 #define V4L2_PIX_FMT_NV12T          v4l2_fourcc('T', 'V', '1', '2')
185 /*
186  * U S E R   D E F I N E D   T Y P E S
187  *
188  */
189 
190 struct fimc_buffer {
191     void    *start;
192     size_t  length;
193 };
194 
195 struct yuv_fmt_list {
196     const char  *name;
197     const char  *desc;
198     unsigned int    fmt;
199     int     depth;
200     int     planes;
201 };
202 
203 //s1 [Apply factory standard]
204 struct camsensor_date_info {
205     unsigned int year;
206     unsigned int month;
207     unsigned int date;
208 };
209 
210 class SecCamera : public virtual RefBase {
211 public:
212 
213     enum CAMERA_ID {
214         CAMERA_ID_BACK  = 0,
215         CAMERA_ID_FRONT = 1,
216     };
217 
218     enum JPEG_QUALITY {
219         JPEG_QUALITY_ECONOMY    = 0,
220         JPEG_QUALITY_NORMAL     = 50,
221         JPEG_QUALITY_SUPERFINE  = 100,
222         JPEG_QUALITY_MAX,
223     };
224 
225     enum OBJECT_TRACKING {
226         OBJECT_TRACKING_OFF,
227         OBJECT_TRACKING_ON,
228         OBJECT_TRACKING_MAX,
229     };
230 
231     /*VT call*/
232     enum VT_MODE {
233         VT_MODE_OFF,
234         VT_MODE_ON,
235         VT_MODE_MAX,
236     };
237 
238     /*Camera sensor mode - Camcorder fix fps*/
239     enum SENSOR_MODE {
240         SENSOR_MODE_CAMERA,
241         SENSOR_MODE_MOVIE,
242     };
243 
244     /*Camera Shot mode*/
245     enum SHOT_MODE {
246         SHOT_MODE_SINGLE        = 0,
247         SHOT_MODE_CONTINUOUS    = 1,
248         SHOT_MODE_PANORAMA      = 2,
249         SHOT_MODE_SMILE         = 3,
250         SHOT_MODE_SELF          = 6,
251     };
252 
253     enum CHK_DATALINE {
254         CHK_DATALINE_OFF,
255         CHK_DATALINE_ON,
256         CHK_DATALINE_MAX,
257     };
258 
259     int m_touch_af_start_stop;
260 
261     struct gps_info_latiude {
262         unsigned int    north_south;
263         unsigned int    dgree;
264         unsigned int    minute;
265         unsigned int    second;
266     } gpsInfoLatitude;
267     struct gps_info_longitude {
268         unsigned int    east_west;
269         unsigned int    dgree;
270         unsigned int    minute;
271         unsigned int    second;
272     } gpsInfoLongitude;
273     struct gps_info_altitude {
274         unsigned int    plus_minus;
275         unsigned int    dgree;
276         unsigned int    minute;
277         unsigned int    second;
278     } gpsInfoAltitude;
279 
280     SecCamera();
281     virtual ~SecCamera();
282 
createInstance(void)283     static SecCamera* createInstance(void)
284     {
285         static SecCamera singleton;
286         return &singleton;
287     }
288     status_t dump(int fd);
289 
290     int             getCameraId(void);
291 
292     int             startPreview(void);
293     int             stopPreview(void);
294 
295     int             startRecord(void);
296     int             stopRecord(void);
297     int             getRecordFrame(void);
298     int             releaseRecordFrame(int index);
299     unsigned int    getRecPhyAddrY(int);
300     unsigned int    getRecPhyAddrC(int);
301 
302     int             getPreview(void);
303     int             setPreviewSize(int width, int height, int pixel_format);
304     int             getPreviewSize(int *width, int *height, int *frame_size);
305     int             getPreviewMaxSize(int *width, int *height);
306     int             getPreviewPixelFormat(void);
307     int             setPreviewImage(int index, unsigned char *buffer, int size);
308 
309     int             setSnapshotSize(int width, int height);
310     int             getSnapshotSize(int *width, int *height, int *frame_size);
311     int             getSnapshotMaxSize(int *width, int *height);
312     int             setSnapshotPixelFormat(int pixel_format);
313     int             getSnapshotPixelFormat(void);
314 
315     unsigned char*  getJpeg(unsigned char *snapshot_data, int snapshot_size, int *size);
316     unsigned char*  yuv2Jpeg(unsigned char *raw_data, int raw_size,
317                                 int *jpeg_size,
318                                 int width, int height, int pixel_format);
319 
320     int             setJpegThumbnailSize(int width, int height);
321     int             getJpegThumbnailSize(int *width, int *height);
322 
323     int             setAutofocus(void);
324     int             zoomIn(void);
325     int             zoomOut(void);
326 
327     int             SetRotate(int angle);
328     int             getRotate(void);
329 
330     int             setVerticalMirror(void);
331     int             setHorizontalMirror(void);
332 
333     int             setWhiteBalance(int white_balance);
334     int             getWhiteBalance(void);
335 
336     int             setBrightness(int brightness);
337     int             getBrightness(void);
338 
339     int             setImageEffect(int image_effect);
340     int             getImageEffect(void);
341 
342     int             setSceneMode(int scene_mode);
343     int             getSceneMode(void);
344 
345     int             setFlashMode(int flash_mode);
346     int             getFlashMode(void);
347 
348     int             setMetering(int metering_value);
349     int             getMetering(void);
350 
351     int             setISO(int iso_value);
352     int             getISO(void);
353 
354     int             setContrast(int contrast_value);
355     int             getContrast(void);
356 
357     int             setSaturation(int saturation_value);
358     int             getSaturation(void);
359 
360     int             setSharpness(int sharpness_value);
361     int             getSharpness(void);
362 
363     int             setWDR(int wdr_value);
364     int             getWDR(void);
365 
366     int             setAntiShake(int anti_shake);
367     int             getAntiShake(void);
368 
369     int             setJpegQuality(int jpeg_qality);
370     int             getJpegQuality(void);
371 
372     int             setZoom(int zoom_level);
373     int             getZoom(void);
374 
375     int             setObjectTracking(int object_tracking);
376     int             getObjectTracking(void);
377     int             getObjectTrackingStatus(void);
378 
379     int             setSmartAuto(int smart_auto);
380     int             getSmartAuto(void);
381     int             getAutosceneStatus(void);
382 
383     int             setBeautyShot(int beauty_shot);
384     int             getBeautyShot(void);
385 
386     int             setVintageMode(int vintage_mode);
387     int             getVintageMode(void);
388 
389     int             setFocusMode(int focus_mode);
390     int             getFocusMode(void);
391 
392     int             setFaceDetect(int face_detect);
393     int             getFaceDetect(void);
394 
395     int             setGPSLatitude(const char *gps_latitude);
396     int             setGPSLongitude(const char *gps_longitude);
397     int             setGPSAltitude(const char *gps_altitude);
398     int             setGPSTimeStamp(const char *gps_timestamp);
399     int             setGPSProcessingMethod(const char *gps_timestamp);
400     int             cancelAutofocus(void);
401     int             setFaceDetectLockUnlock(int facedetect_lockunlock);
402     int             setObjectPosition(int x, int y);
403     int             setObjectTrackingStartStop(int start_stop);
404     int             setTouchAFStartStop(int start_stop);
405     int             setCAFStatus(int on_off);
406     int             getAutoFocusResult(void);
407     int             setAntiBanding(int anti_banding);
408     int             getPostview(void);
409     int             setRecordingSize(int width, int height);
410     int             setGamma(int gamma);
411     int             setSlowAE(int slow_ae);
412     int             setExifOrientationInfo(int orientationInfo);
413     int             setBatchReflection(void);
414     int             setSnapshotCmd(void);
415     int             endSnapshot(void);
416     int             setCameraSensorReset(void);
417     int             setSensorMode(int sensor_mode); /* Camcorder fix fps */
418     int             setShotMode(int shot_mode);     /* Shot mode */
419     /*VT call*/
420     int             setVTmode(int vtmode);
421     int             getVTmode(void);
422     int             setBlur(int blur_level);
423     int             getBlur(void);
424     int             setDataLineCheck(int chk_dataline);
425     int             getDataLineCheck(void);
426     int             setDataLineCheckStop(void);
427     int             setDefultIMEI(int imei);
428     int             getDefultIMEI(void);
429     const __u8*     getCameraSensorName(void);
430     int             previewPoll(bool preview);
431 #ifdef ENABLE_ESD_PREVIEW_CHECK
432     int             getCameraSensorESDStatus(void);
433 #endif // ENABLE_ESD_PREVIEW_CHECK
434 
435     int setFrameRate(int frame_rate);
436     unsigned char*  getJpeg(int*, unsigned int*);
437     int             getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
438                                         unsigned int *output_size);
439     int             getExif(unsigned char *pExifDst, unsigned char *pThumbSrc);
440 
441     void            getPostViewConfig(int*, int*, int*);
442     void            getThumbnailConfig(int *width, int *height, int *size);
443 
444     int             getPostViewOffset(void);
445     int             getCameraFd(void);
446     int             getJpegFd(void);
447     void            SetJpgAddr(unsigned char *addr);
448     unsigned int    getPhyAddrY(int);
449     unsigned int    getPhyAddrC(int);
450     void            pausePreview();
451     int             initCamera(int index);
452     void            DeinitCamera();
setJpegRatio(double ratio)453     static void     setJpegRatio(double ratio)
454     {
455         if((ratio < 0) || (ratio > 1))
456             return;
457 
458         jpeg_ratio = ratio;
459     }
460 
getJpegRatio()461     static double   getJpegRatio()
462     {
463         return jpeg_ratio;
464     }
465 
setInterleaveDataSize(int x)466     static void     setInterleaveDataSize(int x)
467     {
468         interleaveDataSize = x;
469     }
470 
getInterleaveDataSize()471     static int      getInterleaveDataSize()
472     {
473         return interleaveDataSize;
474     }
475 
setJpegLineLength(int x)476     static void     setJpegLineLength(int x)
477     {
478         jpegLineLength = x;
479     }
480 
getJpegLineLength()481     static int      getJpegLineLength()
482     {
483         return jpegLineLength;
484     }
485 
486 
487 private:
488     v4l2_streamparm m_streamparm;
489     struct sec_cam_parm   *m_params;
490     int             m_flag_init;
491 
492     int             m_camera_id;
493 
494     int             m_cam_fd;
495 
496     int             m_cam_fd2;
497     struct pollfd   m_events_c2;
498     int             m_flag_record_start;
499 
500     int             m_preview_v4lformat;
501     int             m_preview_width;
502     int             m_preview_height;
503     int             m_preview_max_width;
504     int             m_preview_max_height;
505 
506     int             m_snapshot_v4lformat;
507     int             m_snapshot_width;
508     int             m_snapshot_height;
509     int             m_snapshot_max_width;
510     int             m_snapshot_max_height;
511 
512     int             m_angle;
513     int             m_anti_banding;
514     int             m_wdr;
515     int             m_anti_shake;
516     int             m_zoom_level;
517     int             m_object_tracking;
518     int             m_smart_auto;
519     int             m_beauty_shot;
520     int             m_vintage_mode;
521     int             m_face_detect;
522     int             m_object_tracking_start_stop;
523     int             m_recording_width;
524     int             m_recording_height;
525     bool            m_gps_enabled;
526     long            m_gps_latitude;  /* degrees * 1e7 */
527     long            m_gps_longitude; /* degrees * 1e7 */
528     long            m_gps_altitude;  /* metres * 100 */
529     long            m_gps_timestamp;
530     int             m_vtmode;
531     int             m_sensor_mode; /*Camcorder fix fps */
532     int             m_shot_mode; /* Shot mode */
533     int             m_exif_orientation;
534     int             m_blur_level;
535     int             m_chk_dataline;
536     int             m_video_gamma;
537     int             m_slow_ae;
538     int             m_caf_on_off;
539     int             m_default_imei;
540     int             m_camera_af_flag;
541 
542     int             m_flag_camera_start;
543 
544     int             m_jpeg_fd;
545     int             m_jpeg_thumbnail_width;
546     int             m_jpeg_thumbnail_height;
547     int             m_jpeg_quality;
548 
549     int             m_postview_offset;
550 
551 #ifdef ENABLE_ESD_PREVIEW_CHECK
552     int             m_esd_check_count;
553 #endif // ENABLE_ESD_PREVIEW_CHECK
554 
555     exif_attribute_t mExifInfo;
556 
557     struct fimc_buffer m_capture_buf;
558     struct pollfd   m_events_c;
559 
560     inline int      m_frameSize(int format, int width, int height);
561 
562     void            setExifChangedAttribute();
563     void            setExifFixedAttribute();
564     void            resetCamera();
565 
566     static double   jpeg_ratio;
567     static int      interleaveDataSize;
568     static int      jpegLineLength;
569 };
570 
571 extern unsigned long measure_time(struct timeval *start, struct timeval *stop);
572 
573 }; // namespace android
574 
575 #endif // ANDROID_HARDWARE_CAMERA_SEC_H
576