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 LOGD 50 #define LOG_CAMERA_PREVIEW LOGD 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 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(); 453 static void setJpegRatio(double ratio) 454 { 455 if((ratio < 0) || (ratio > 1)) 456 return; 457 458 jpeg_ratio = ratio; 459 } 460 461 static double getJpegRatio() 462 { 463 return jpeg_ratio; 464 } 465 466 static void setInterleaveDataSize(int x) 467 { 468 interleaveDataSize = x; 469 } 470 471 static int getInterleaveDataSize() 472 { 473 return interleaveDataSize; 474 } 475 476 static void setJpegLineLength(int x) 477 { 478 jpegLineLength = x; 479 } 480 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