From 2220e09974e1594a9b97c1d9f941a8448cfef8e7 Mon Sep 17 00:00:00 2001 From: Mekala Natarajan Date: Mon, 25 Aug 2014 23:33:50 -0700 Subject: Camera: Add new exif tags for CTS compliance Added new CTS tags for make, model, flash, wb, subsec time. Bug: 16737746 Change-Id: I04f202b2bee4150eec90805675183b2bb627b5d7 --- camera/QCameraHWI.h | 6 +- camera/QCameraHWI_Parm.cpp | 140 +++++++++++++++++++++++++++++---------------- 2 files changed, 95 insertions(+), 51 deletions(-) (limited to 'camera') diff --git a/camera/QCameraHWI.h b/camera/QCameraHWI.h index e7f9397..f7e58ef 100755 --- a/camera/QCameraHWI.h +++ b/camera/QCameraHWI.h @@ -201,7 +201,7 @@ static const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, static const char ExifUndefinedPrefix[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // "\0\0\0\0\0\0\0\0" //EXIF detfines -#define MAX_EXIF_TABLE_ENTRIES 20 +#define MAX_EXIF_TABLE_ENTRIES 23 #define GPS_PROCESSING_METHOD_SIZE 101 #define FOCAL_LENGTH_DECIMAL_PRECISION 100 #define EXIF_ASCII_PREFIX_SIZE 8 //(sizeof(ExifAsciiPrefix)) @@ -219,6 +219,7 @@ typedef struct{ char gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE+GPS_PROCESSING_METHOD_SIZE]; //Other tags char dateTime[20]; + char subsecTime[7]; rat_t focalLength; rat_t f_number; uint16_t flashMode; @@ -233,6 +234,9 @@ typedef struct{ int mAltitude_ref; long mGPSTimestamp; + int mWbMode; + char make[20]; + char model[20]; } exif_values_t; diff --git a/camera/QCameraHWI_Parm.cpp b/camera/QCameraHWI_Parm.cpp index 7285ddd..69c8d2b 100644 --- a/camera/QCameraHWI_Parm.cpp +++ b/camera/QCameraHWI_Parm.cpp @@ -4044,23 +4044,44 @@ void QCameraHardwareInterface::addExifTag(exif_tag_id_t tagid, exif_tag_type_t t } void QCameraHardwareInterface::initExifData(){ + short val_short; + char value[PROPERTY_VALUE_MAX]; + if (property_get("ro.product.manufacturer", value, "QCOM-AA") > 0) { + strncpy(mExifValues.make, value, 19); + mExifValues.make[19] = '\0'; + addExifTag(EXIFTAGID_MAKE, EXIF_ASCII, strlen(value) + 1, 1, (void *)mExifValues.make); + } else { + ALOGE("%s: getExifMaker failed", __func__); + } + + if (property_get("ro.product.model", value, "QCAM-AA") > 0) { + strncpy(mExifValues.model, value, 19); + mExifValues.model[19] = '\0'; + addExifTag(EXIFTAGID_MODEL, EXIF_ASCII, strlen(value) + 1, 1, (void *)mExifValues.model); + } else { + ALOGE("%s: getExifModel failed", __func__); + } + if(mExifValues.dateTime) { addExifTag(EXIFTAGID_EXIF_DATE_TIME_ORIGINAL, EXIF_ASCII, - 20, 1, (void *)mExifValues.dateTime); + 20, 1, (void *)mExifValues.dateTime); addExifTag(EXIFTAGID_EXIF_DATE_TIME_DIGITIZED, EXIF_ASCII, - 20, 1, (void *)mExifValues.dateTime); + 20, 1, (void *)mExifValues.dateTime); } addExifTag(EXIFTAGID_FOCAL_LENGTH, EXIF_RATIONAL, 1, 1, (void *)&(mExifValues.focalLength)); addExifTag(EXIFTAGID_ISO_SPEED_RATING,EXIF_SHORT,1,1,(void *)&(mExifValues.isoSpeed)); // normal f_number is from 1.2 to 22, but I'd like to put some margin. - if(mExifValues.f_number.num>0 && mExifValues.f_number.num<3200) - addExifTag(EXIFTAGID_F_NUMBER,EXIF_RATIONAL,1,1,(void *)&(mExifValues.f_number)); + if(mExifValues.f_number.num>0 && mExifValues.f_number.num<3200) { + addExifTag(EXIFTAGID_F_NUMBER,EXIF_RATIONAL,1,1,(void *)&(mExifValues.f_number)); + addExifTag(EXIFTAGID_APERTURE,EXIF_RATIONAL,1,1,(void *)&(mExifValues.f_number)); + } + if(mExifValues.mGpsProcess) { addExifTag(EXIFTAGID_GPS_PROCESSINGMETHOD, EXIF_ASCII, - EXIF_ASCII_PREFIX_SIZE + strlen(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE) + 1, - 1, (void *)mExifValues.gpsProcessingMethod); + EXIF_ASCII_PREFIX_SIZE + strlen(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE) + 1, + 1, (void *)mExifValues.gpsProcessingMethod); } if(mExifValues.mLatitude) { @@ -4068,7 +4089,7 @@ void QCameraHardwareInterface::initExifData(){ if(mExifValues.latRef) { addExifTag(EXIFTAGID_GPS_LATITUDE_REF, EXIF_ASCII, 2, - 1, (void *)mExifValues.latRef); + 1, (void *)mExifValues.latRef); } } @@ -4077,13 +4098,13 @@ void QCameraHardwareInterface::initExifData(){ if(mExifValues.lonRef) { addExifTag(EXIFTAGID_GPS_LONGITUDE_REF, EXIF_ASCII, 2, - 1, (void *)mExifValues.lonRef); + 1, (void *)mExifValues.lonRef); } } if(mExifValues.mAltitude) { addExifTag(EXIFTAGID_GPS_ALTITUDE, EXIF_RATIONAL, 1, - 1, (void *)&(mExifValues.altitude)); + 1, (void *)&(mExifValues.altitude)); addExifTag(EXIFTAGID_GPS_ALTITUDE_REF, EXIF_BYTE, 1, 1, (void *)&mExifValues.mAltitude_ref); } @@ -4097,19 +4118,32 @@ void QCameraHardwareInterface::initExifData(){ strftime(mExifValues.gpsDateStamp, sizeof(mExifValues.gpsDateStamp), "%Y:%m:%d", UTCTimestamp); addExifTag(EXIFTAGID_GPS_DATESTAMP, EXIF_ASCII, - strlen(mExifValues.gpsDateStamp)+1 , 1, (void *)mExifValues.gpsDateStamp); + strlen(mExifValues.gpsDateStamp)+1 , 1, (void *)mExifValues.gpsDateStamp); mExifValues.gpsTimeStamp[0] = getRational(UTCTimestamp->tm_hour, 1); mExifValues.gpsTimeStamp[1] = getRational(UTCTimestamp->tm_min, 1); mExifValues.gpsTimeStamp[2] = getRational(UTCTimestamp->tm_sec, 1); addExifTag(EXIFTAGID_GPS_TIMESTAMP, EXIF_RATIONAL, - 3, 1, (void *)mExifValues.gpsTimeStamp); + 3, 1, (void *)mExifValues.gpsTimeStamp); ALOGV("EXIFTAGID_GPS_TIMESTAMP set"); } if(mExifValues.exposure_time.num || mExifValues.exposure_time.denom) addExifTag(EXIFTAGID_EXPOSURE_TIME, EXIF_RATIONAL, 1, 1, (void *)&mExifValues.exposure_time); + bool flashCondition = getFlashCondition(); + addExifTag(EXIFTAGID_FLASH, EXIF_SHORT, 1, 1, &flashCondition); + if (mExifValues.mWbMode == CAMERA_WB_AUTO) + val_short = 0; + else + val_short = 1; + addExifTag(EXIFTAGID_WHITE_BALANCE, EXIF_SHORT, 1, 1, &val_short); + + addExifTag(EXIFTAGID_SUBSEC_TIME, EXIF_ASCII, 7, 1, (void *)mExifValues.subsecTime); + + addExifTag(EXIFTAGID_SUBSEC_TIME_ORIGINAL, EXIF_ASCII, 7, 1, (void *)mExifValues.subsecTime); + + addExifTag(EXIFTAGID_SUBSEC_TIME_DIGITIZED, EXIF_ASCII, 7, 1, (void *)mExifValues.subsecTime); } //Add all exif tags in this function @@ -4120,13 +4154,13 @@ void QCameraHardwareInterface::setExifTags() //set TimeStamp str = mParameters.get(QCameraParameters::KEY_EXIF_DATETIME); if(str != NULL) { - strncpy(mExifValues.dateTime, str, 19); - mExifValues.dateTime[19] = '\0'; + strncpy(mExifValues.dateTime, str, 19); + mExifValues.dateTime[19] = '\0'; } //Set focal length int focalLengthValue = (int) (mParameters.getFloat( - QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION); + QCameraParameters::KEY_FOCAL_LENGTH) * FOCAL_LENGTH_DECIMAL_PRECISION); mExifValues.focalLength = getRational(focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION); @@ -4166,10 +4200,16 @@ void QCameraHardwareInterface::setExifTags() //Write datetime according to EXIF Spec //"YYYY:MM:DD HH:MM:SS" (20 chars including \0) snprintf(mExifValues.dateTime, 20, "%04d:%02d:%02d %02d:%02d:%02d", - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, - timeinfo->tm_mday, timeinfo->tm_hour, - timeinfo->tm_min, timeinfo->tm_sec); + timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, + timeinfo->tm_mday, timeinfo->tm_hour, + timeinfo->tm_min, timeinfo->tm_sec); //set gps tags + + struct timeval tv; + gettimeofday(&tv, NULL); + snprintf(mExifValues.subsecTime, 7, "%06ld", tv.tv_usec); + + mExifValues.mWbMode = mParameters.getInt(QCameraParameters::KEY_WHITE_BALANCE); setExifTagsGPS(); } @@ -4180,13 +4220,13 @@ void QCameraHardwareInterface::setExifTagsGPS() //Set GPS processing method str = mParameters.get(QCameraParameters::KEY_GPS_PROCESSING_METHOD); if(str != NULL) { - memcpy(mExifValues.gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE); - strncpy(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str, - GPS_PROCESSING_METHOD_SIZE - 1); - mExifValues.gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE-1] = '\0'; - ALOGV("EXIFTAGID_GPS_PROCESSINGMETHOD = %s %s", mExifValues.gpsProcessingMethod, - mExifValues.gpsProcessingMethod+8); - mExifValues.mGpsProcess = true; + memcpy(mExifValues.gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE); + strncpy(mExifValues.gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, str, + GPS_PROCESSING_METHOD_SIZE - 1); + mExifValues.gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE-1] = '\0'; + ALOGV("EXIFTAGID_GPS_PROCESSINGMETHOD = %s %s", mExifValues.gpsProcessingMethod, + mExifValues.gpsProcessingMethod+8); + mExifValues.mGpsProcess = true; }else{ mExifValues.mGpsProcess = false; } @@ -4257,10 +4297,10 @@ void QCameraHardwareInterface::setExifTagsGPS() str = NULL; str = mParameters.get(QCameraParameters::KEY_GPS_TIMESTAMP); if(str != NULL) { - mExifValues.mTimeStamp = true; - mExifValues.mGPSTimestamp = atol(str); + mExifValues.mTimeStamp = true; + mExifValues.mGPSTimestamp = atol(str); }else{ - mExifValues.mTimeStamp = false; + mExifValues.mTimeStamp = false; } } @@ -4287,31 +4327,31 @@ bool QCameraHardwareInterface::isLowPowerCamcorder() { return true; if(mHFRLevel > 1) /* hard code the value now. Need to move tgtcommon to camear.h */ - return true; + return true; - return false; + return false; } status_t QCameraHardwareInterface::setNoDisplayMode(const QCameraParameters& params) { - char prop[PROPERTY_VALUE_MAX]; - memset(prop, 0, sizeof(prop)); - property_get("persist.camera.nodisplay", prop, "0"); - int prop_val = atoi(prop); - - if (prop_val == 0) { - const char *str_val = params.get("no-display-mode"); - if(str_val && strlen(str_val) > 0) { - mNoDisplayMode = atoi(str_val); + char prop[PROPERTY_VALUE_MAX]; + memset(prop, 0, sizeof(prop)); + property_get("persist.camera.nodisplay", prop, "0"); + int prop_val = atoi(prop); + + if (prop_val == 0) { + const char *str_val = params.get("no-display-mode"); + if(str_val && strlen(str_val) > 0) { + mNoDisplayMode = atoi(str_val); + } else { + mNoDisplayMode = 0; + } + ALOGV("Param mNoDisplayMode =%d", mNoDisplayMode); } else { - mNoDisplayMode = 0; + mNoDisplayMode = prop_val; + ALOGV("prop mNoDisplayMode =%d", mNoDisplayMode); } - ALOGV("Param mNoDisplayMode =%d", mNoDisplayMode); - } else { - mNoDisplayMode = prop_val; - ALOGV("prop mNoDisplayMode =%d", mNoDisplayMode); - } - return NO_ERROR; + return NO_ERROR; } status_t QCameraHardwareInterface::setCAFLockCancel(void) @@ -4320,8 +4360,8 @@ status_t QCameraHardwareInterface::setCAFLockCancel(void) //for CAF unlock if(MM_CAMERA_OK!=cam_ops_action(mCameraId,false,MM_CAMERA_OPS_FOCUS,NULL )) { - ALOGE("%s: AF command failed err:%d error %s",__func__, errno,strerror(errno)); - return -1; + ALOGE("%s: AF command failed err:%d error %s",__func__, errno,strerror(errno)); + return -1; } ALOGV("%s : X", __func__); @@ -4338,14 +4378,14 @@ void QCameraHardwareInterface::prepareVideoPicture(bool disable){ mParameters.setPictureSize(mDimension.video_width, mDimension.video_height); mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_SIZES, - str.string()); + str.string()); ALOGV("%s: Video Picture size supported = %d X %d", - __func__,mDimension.video_width,mDimension.video_height); + __func__,mDimension.video_width,mDimension.video_height); }else{ //Set Picture Size mParameters.setPictureSize(mDimension.picture_width, mDimension.picture_height); mParameters.set(QCameraParameters::KEY_SUPPORTED_PICTURE_SIZES, - mPictureSizeValues.string()); + mPictureSizeValues.string()); } } -- cgit v1.2.3