summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMekala Natarajan <mekalan@codeaurora.org>2014-08-25 23:33:50 -0700
committerVineeta Srivastava <vsrivastava@google.com>2014-08-26 19:42:45 +0000
commit2220e09974e1594a9b97c1d9f941a8448cfef8e7 (patch)
tree0233247e8a87fe8c38f6f04c00190100f243fb7f
parent1373166794b684a340663ccc55cbc53906b90893 (diff)
downloadmako-2220e09974e1594a9b97c1d9f941a8448cfef8e7.tar.gz
Camera: Add new exif tags for CTS compliance
Added new CTS tags for make, model, flash, wb, subsec time. Bug: 16737746 Change-Id: I04f202b2bee4150eec90805675183b2bb627b5d7
-rwxr-xr-xcamera/QCameraHWI.h6
-rw-r--r--camera/QCameraHWI_Parm.cpp140
2 files changed, 95 insertions, 51 deletions
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());
}
}