1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "CamComm1.0-Exif" 18 #define ATRACE_TAG ATRACE_TAG_CAMERA 19 //#define LOG_NDEBUG 0 20 21 #include <android/log.h> 22 23 #include <inttypes.h> 24 #include <math.h> 25 #include <stdint.h> 26 #include <string> 27 #include <vector> 28 29 #include "Exif.h" 30 31 extern "C" { 32 #include <libexif/exif-data.h> 33 } 34 35 namespace std { 36 37 template <> 38 struct default_delete<ExifEntry> { 39 inline void operator()(ExifEntry* entry) const { exif_entry_unref(entry); } 40 }; 41 42 } // namespace std 43 44 45 namespace android { 46 namespace hardware { 47 namespace camera { 48 namespace common { 49 namespace V1_0 { 50 namespace helper { 51 52 53 class ExifUtilsImpl : public ExifUtils { 54 public: 55 ExifUtilsImpl(); 56 57 virtual ~ExifUtilsImpl(); 58 59 // Initialize() can be called multiple times. The setting of Exif tags will be 60 // cleared. 61 virtual bool initialize(); 62 63 // set all known fields from a metadata structure 64 virtual bool setFromMetadata(const CameraMetadata& metadata, 65 const size_t imageWidth, 66 const size_t imageHeight); 67 68 // sets the len aperture. 69 // Returns false if memory allocation fails. 70 virtual bool setAperture(uint32_t numerator, uint32_t denominator); 71 72 // sets the value of brightness. 73 // Returns false if memory allocation fails. 74 virtual bool setBrightness(int32_t numerator, int32_t denominator); 75 76 // sets the color space. 77 // Returns false if memory allocation fails. 78 virtual bool setColorSpace(uint16_t color_space); 79 80 // sets the information to compressed data. 81 // Returns false if memory allocation fails. 82 virtual bool setComponentsConfiguration(const std::string& components_configuration); 83 84 // sets the compression scheme used for the image data. 85 // Returns false if memory allocation fails. 86 virtual bool setCompression(uint16_t compression); 87 88 // sets image contrast. 89 // Returns false if memory allocation fails. 90 virtual bool setContrast(uint16_t contrast); 91 92 // sets the date and time of image last modified. It takes local time. The 93 // name of the tag is DateTime in IFD0. 94 // Returns false if memory allocation fails. 95 virtual bool setDateTime(const struct tm& t); 96 97 // sets the image description. 98 // Returns false if memory allocation fails. 99 virtual bool setDescription(const std::string& description); 100 101 // sets the digital zoom ratio. If the numerator is 0, it means digital zoom 102 // was not used. 103 // Returns false if memory allocation fails. 104 virtual bool setDigitalZoomRatio(uint32_t numerator, uint32_t denominator); 105 106 // sets the exposure bias. 107 // Returns false if memory allocation fails. 108 virtual bool setExposureBias(int32_t numerator, int32_t denominator); 109 110 // sets the exposure mode set when the image was shot. 111 // Returns false if memory allocation fails. 112 virtual bool setExposureMode(uint16_t exposure_mode); 113 114 // sets the program used by the camera to set exposure when the picture is 115 // taken. 116 // Returns false if memory allocation fails. 117 virtual bool setExposureProgram(uint16_t exposure_program); 118 119 // sets the exposure time, given in seconds. 120 // Returns false if memory allocation fails. 121 virtual bool setExposureTime(uint32_t numerator, uint32_t denominator); 122 123 // sets the status of flash. 124 // Returns false if memory allocation fails. 125 virtual bool setFlash(uint16_t flash); 126 127 // sets the F number. 128 // Returns false if memory allocation fails. 129 virtual bool setFNumber(uint32_t numerator, uint32_t denominator); 130 131 // sets the focal length of lens used to take the image in millimeters. 132 // Returns false if memory allocation fails. 133 virtual bool setFocalLength(uint32_t numerator, uint32_t denominator); 134 135 // sets the degree of overall image gain adjustment. 136 // Returns false if memory allocation fails. 137 virtual bool setGainControl(uint16_t gain_control); 138 139 // sets the altitude in meters. 140 // Returns false if memory allocation fails. 141 virtual bool setGpsAltitude(double altitude); 142 143 // sets the latitude with degrees minutes seconds format. 144 // Returns false if memory allocation fails. 145 virtual bool setGpsLatitude(double latitude); 146 147 // sets the longitude with degrees minutes seconds format. 148 // Returns false if memory allocation fails. 149 virtual bool setGpsLongitude(double longitude); 150 151 // sets GPS processing method. 152 // Returns false if memory allocation fails. 153 virtual bool setGpsProcessingMethod(const std::string& method); 154 155 // sets GPS date stamp and time stamp (atomic clock). It takes UTC time. 156 // Returns false if memory allocation fails. 157 virtual bool setGpsTimestamp(const struct tm& t); 158 159 // sets the length (number of rows) of main image. 160 // Returns false if memory allocation fails. 161 virtual bool setImageHeight(uint32_t length); 162 163 // sets the width (number of columes) of main image. 164 // Returns false if memory allocation fails. 165 virtual bool setImageWidth(uint32_t width); 166 167 // sets the ISO speed. 168 // Returns false if memory allocation fails. 169 virtual bool setIsoSpeedRating(uint16_t iso_speed_ratings); 170 171 // sets the kind of light source. 172 // Returns false if memory allocation fails. 173 virtual bool setLightSource(uint16_t light_source); 174 175 // sets the smallest F number of the lens. 176 // Returns false if memory allocation fails. 177 virtual bool setMaxAperture(uint32_t numerator, uint32_t denominator); 178 179 // sets the metering mode. 180 // Returns false if memory allocation fails. 181 virtual bool setMeteringMode(uint16_t metering_mode); 182 183 // sets image orientation. 184 // Returns false if memory allocation fails. 185 virtual bool setOrientation(uint16_t orientation); 186 187 // sets the unit for measuring XResolution and YResolution. 188 // Returns false if memory allocation fails. 189 virtual bool setResolutionUnit(uint16_t resolution_unit); 190 191 // sets image saturation. 192 // Returns false if memory allocation fails. 193 virtual bool setSaturation(uint16_t saturation); 194 195 // sets the type of scene that was shot. 196 // Returns false if memory allocation fails. 197 virtual bool setSceneCaptureType(uint16_t type); 198 199 // sets image sharpness. 200 // Returns false if memory allocation fails. 201 virtual bool setSharpness(uint16_t sharpness); 202 203 // sets the shutter speed. 204 // Returns false if memory allocation fails. 205 virtual bool setShutterSpeed(int32_t numerator, int32_t denominator); 206 207 // sets the distance to the subject, given in meters. 208 // Returns false if memory allocation fails. 209 virtual bool setSubjectDistance(uint32_t numerator, uint32_t denominator); 210 211 // sets the fractions of seconds for the <DateTime> tag. 212 // Returns false if memory allocation fails. 213 virtual bool setSubsecTime(const std::string& subsec_time); 214 215 // sets the white balance mode set when the image was shot. 216 // Returns false if memory allocation fails. 217 virtual bool setWhiteBalance(uint16_t white_balance); 218 219 // sets the number of pixels per resolution unit in the image width. 220 // Returns false if memory allocation fails. 221 virtual bool setXResolution(uint32_t numerator, uint32_t denominator); 222 223 // sets the position of chrominance components in relation to the luminance 224 // component. 225 // Returns false if memory allocation fails. 226 virtual bool setYCbCrPositioning(uint16_t ycbcr_positioning); 227 228 // sets the number of pixels per resolution unit in the image length. 229 // Returns false if memory allocation fails. 230 virtual bool setYResolution(uint32_t numerator, uint32_t denominator); 231 232 // sets the manufacturer of camera. 233 // Returns false if memory allocation fails. 234 virtual bool setMake(const std::string& make); 235 236 // sets the model number of camera. 237 // Returns false if memory allocation fails. 238 virtual bool setModel(const std::string& model); 239 240 // Generates APP1 segment. 241 // Returns false if generating APP1 segment fails. 242 virtual bool generateApp1(const void* thumbnail_buffer, uint32_t size); 243 244 // Gets buffer of APP1 segment. This method must be called only after calling 245 // GenerateAPP1(). 246 virtual const uint8_t* getApp1Buffer(); 247 248 // Gets length of APP1 segment. This method must be called only after calling 249 // GenerateAPP1(). 250 virtual unsigned int getApp1Length(); 251 252 protected: 253 // sets the version of this standard supported. 254 // Returns false if memory allocation fails. 255 virtual bool setExifVersion(const std::string& exif_version); 256 257 258 // Resets the pointers and memories. 259 virtual void reset(); 260 261 // Adds a variable length tag to |exif_data_|. It will remove the original one 262 // if the tag exists. 263 // Returns the entry of the tag. The reference count of returned ExifEntry is 264 // two. 265 virtual std::unique_ptr<ExifEntry> addVariableLengthEntry(ExifIfd ifd, 266 ExifTag tag, 267 ExifFormat format, 268 uint64_t components, 269 unsigned int size); 270 271 // Adds a entry of |tag| in |exif_data_|. It won't remove the original one if 272 // the tag exists. 273 // Returns the entry of the tag. It adds one reference count to returned 274 // ExifEntry. 275 virtual std::unique_ptr<ExifEntry> addEntry(ExifIfd ifd, ExifTag tag); 276 277 // Helpe functions to add exif data with different types. 278 virtual bool setShort(ExifIfd ifd, 279 ExifTag tag, 280 uint16_t value, 281 const std::string& msg); 282 283 virtual bool setLong(ExifIfd ifd, 284 ExifTag tag, 285 uint32_t value, 286 const std::string& msg); 287 288 virtual bool setRational(ExifIfd ifd, 289 ExifTag tag, 290 uint32_t numerator, 291 uint32_t denominator, 292 const std::string& msg); 293 294 virtual bool setSRational(ExifIfd ifd, 295 ExifTag tag, 296 int32_t numerator, 297 int32_t denominator, 298 const std::string& msg); 299 300 virtual bool setString(ExifIfd ifd, 301 ExifTag tag, 302 ExifFormat format, 303 const std::string& buffer, 304 const std::string& msg); 305 306 // Destroys the buffer of APP1 segment if exists. 307 virtual void destroyApp1(); 308 309 // The Exif data (APP1). Owned by this class. 310 ExifData* exif_data_; 311 // The raw data of APP1 segment. It's allocated by ExifMem in |exif_data_| but 312 // owned by this class. 313 uint8_t* app1_buffer_; 314 // The length of |app1_buffer_|. 315 unsigned int app1_length_; 316 317 }; 318 319 #define SET_SHORT(ifd, tag, value) \ 320 do { \ 321 if (setShort(ifd, tag, value, #tag) == false) \ 322 return false; \ 323 } while (0); 324 325 #define SET_LONG(ifd, tag, value) \ 326 do { \ 327 if (setLong(ifd, tag, value, #tag) == false) \ 328 return false; \ 329 } while (0); 330 331 #define SET_RATIONAL(ifd, tag, numerator, denominator) \ 332 do { \ 333 if (setRational(ifd, tag, numerator, denominator, #tag) == false) \ 334 return false; \ 335 } while (0); 336 337 #define SET_SRATIONAL(ifd, tag, numerator, denominator) \ 338 do { \ 339 if (setSRational(ifd, tag, numerator, denominator, #tag) == false) \ 340 return false; \ 341 } while (0); 342 343 #define SET_STRING(ifd, tag, format, buffer) \ 344 do { \ 345 if (setString(ifd, tag, format, buffer, #tag) == false) \ 346 return false; \ 347 } while (0); 348 349 // This comes from the Exif Version 2.2 standard table 6. 350 const char gExifAsciiPrefix[] = {0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0}; 351 352 static void setLatitudeOrLongitudeData(unsigned char* data, double num) { 353 // Take the integer part of |num|. 354 ExifLong degrees = static_cast<ExifLong>(num); 355 ExifLong minutes = static_cast<ExifLong>(60 * (num - degrees)); 356 ExifLong microseconds = 357 static_cast<ExifLong>(3600000000u * (num - degrees - minutes / 60.0)); 358 exif_set_rational(data, EXIF_BYTE_ORDER_INTEL, {degrees, 1}); 359 exif_set_rational(data + sizeof(ExifRational), EXIF_BYTE_ORDER_INTEL, 360 {minutes, 1}); 361 exif_set_rational(data + 2 * sizeof(ExifRational), EXIF_BYTE_ORDER_INTEL, 362 {microseconds, 1000000}); 363 } 364 365 ExifUtils *ExifUtils::create() { 366 return new ExifUtilsImpl(); 367 } 368 369 ExifUtils::~ExifUtils() { 370 } 371 372 ExifUtilsImpl::ExifUtilsImpl() 373 : exif_data_(nullptr), app1_buffer_(nullptr), app1_length_(0) {} 374 375 ExifUtilsImpl::~ExifUtilsImpl() { 376 reset(); 377 } 378 379 380 bool ExifUtilsImpl::initialize() { 381 reset(); 382 exif_data_ = exif_data_new(); 383 if (exif_data_ == nullptr) { 384 ALOGE("%s: allocate memory for exif_data_ failed", __FUNCTION__); 385 return false; 386 } 387 // set the image options. 388 exif_data_set_option(exif_data_, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION); 389 exif_data_set_data_type(exif_data_, EXIF_DATA_TYPE_COMPRESSED); 390 exif_data_set_byte_order(exif_data_, EXIF_BYTE_ORDER_INTEL); 391 392 // set exif version to 2.2. 393 if (!setExifVersion("0220")) { 394 return false; 395 } 396 397 return true; 398 } 399 400 bool ExifUtilsImpl::setAperture(uint32_t numerator, uint32_t denominator) { 401 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_APERTURE_VALUE, numerator, denominator); 402 return true; 403 } 404 405 bool ExifUtilsImpl::setBrightness(int32_t numerator, int32_t denominator) { 406 SET_SRATIONAL(EXIF_IFD_EXIF, EXIF_TAG_BRIGHTNESS_VALUE, numerator, 407 denominator); 408 return true; 409 } 410 411 bool ExifUtilsImpl::setColorSpace(uint16_t color_space) { 412 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_COLOR_SPACE, color_space); 413 return true; 414 } 415 416 bool ExifUtilsImpl::setComponentsConfiguration( 417 const std::string& components_configuration) { 418 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_COMPONENTS_CONFIGURATION, 419 EXIF_FORMAT_UNDEFINED, components_configuration); 420 return true; 421 } 422 423 bool ExifUtilsImpl::setCompression(uint16_t compression) { 424 SET_SHORT(EXIF_IFD_0, EXIF_TAG_COMPRESSION, compression); 425 return true; 426 } 427 428 bool ExifUtilsImpl::setContrast(uint16_t contrast) { 429 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_CONTRAST, contrast); 430 return true; 431 } 432 433 bool ExifUtilsImpl::setDateTime(const struct tm& t) { 434 // The length is 20 bytes including NULL for termination in Exif standard. 435 char str[20]; 436 int result = snprintf(str, sizeof(str), "%04i:%02i:%02i %02i:%02i:%02i", 437 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, 438 t.tm_min, t.tm_sec); 439 if (result != sizeof(str) - 1) { 440 ALOGW("%s: Input time is invalid", __FUNCTION__); 441 return false; 442 } 443 std::string buffer(str); 444 SET_STRING(EXIF_IFD_0, EXIF_TAG_DATE_TIME, EXIF_FORMAT_ASCII, buffer); 445 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_ORIGINAL, EXIF_FORMAT_ASCII, 446 buffer); 447 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_DATE_TIME_DIGITIZED, EXIF_FORMAT_ASCII, 448 buffer); 449 return true; 450 } 451 452 bool ExifUtilsImpl::setDescription(const std::string& description) { 453 SET_STRING(EXIF_IFD_0, EXIF_TAG_IMAGE_DESCRIPTION, EXIF_FORMAT_ASCII, 454 description); 455 return true; 456 } 457 458 bool ExifUtilsImpl::setDigitalZoomRatio(uint32_t numerator, uint32_t denominator) { 459 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_DIGITAL_ZOOM_RATIO, numerator, 460 denominator); 461 return true; 462 } 463 464 bool ExifUtilsImpl::setExposureBias(int32_t numerator, int32_t denominator) { 465 SET_SRATIONAL(EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_BIAS_VALUE, numerator, 466 denominator); 467 return true; 468 } 469 470 bool ExifUtilsImpl::setExposureMode(uint16_t exposure_mode) { 471 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_MODE, exposure_mode); 472 return true; 473 } 474 475 bool ExifUtilsImpl::setExposureProgram(uint16_t exposure_program) { 476 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_PROGRAM, exposure_program); 477 return true; 478 } 479 480 bool ExifUtilsImpl::setExposureTime(uint32_t numerator, uint32_t denominator) { 481 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_EXPOSURE_TIME, numerator, denominator); 482 return true; 483 } 484 485 bool ExifUtilsImpl::setFlash(uint16_t flash) { 486 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_FLASH, flash); 487 return true; 488 } 489 490 bool ExifUtilsImpl::setFNumber(uint32_t numerator, uint32_t denominator) { 491 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_FNUMBER, numerator, denominator); 492 return true; 493 } 494 495 bool ExifUtilsImpl::setFocalLength(uint32_t numerator, uint32_t denominator) { 496 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_FOCAL_LENGTH, numerator, denominator); 497 return true; 498 } 499 500 bool ExifUtilsImpl::setGainControl(uint16_t gain_control) { 501 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_GAIN_CONTROL, gain_control); 502 return true; 503 } 504 505 bool ExifUtilsImpl::setGpsAltitude(double altitude) { 506 ExifTag refTag = static_cast<ExifTag>(EXIF_TAG_GPS_ALTITUDE_REF); 507 std::unique_ptr<ExifEntry> refEntry = 508 addVariableLengthEntry(EXIF_IFD_GPS, refTag, EXIF_FORMAT_BYTE, 1, 1); 509 if (!refEntry) { 510 ALOGE("%s: Adding GPSAltitudeRef exif entry failed", __FUNCTION__); 511 return false; 512 } 513 if (altitude >= 0) { 514 *refEntry->data = 0; 515 } else { 516 *refEntry->data = 1; 517 altitude *= -1; 518 } 519 520 ExifTag tag = static_cast<ExifTag>(EXIF_TAG_GPS_ALTITUDE); 521 std::unique_ptr<ExifEntry> entry = addVariableLengthEntry( 522 EXIF_IFD_GPS, tag, EXIF_FORMAT_RATIONAL, 1, sizeof(ExifRational)); 523 if (!entry) { 524 exif_content_remove_entry(exif_data_->ifd[EXIF_IFD_GPS], refEntry.get()); 525 ALOGE("%s: Adding GPSAltitude exif entry failed", __FUNCTION__); 526 return false; 527 } 528 exif_set_rational(entry->data, EXIF_BYTE_ORDER_INTEL, 529 {static_cast<ExifLong>(altitude * 1000), 1000}); 530 531 return true; 532 } 533 534 bool ExifUtilsImpl::setGpsLatitude(double latitude) { 535 const ExifTag refTag = static_cast<ExifTag>(EXIF_TAG_GPS_LATITUDE_REF); 536 std::unique_ptr<ExifEntry> refEntry = 537 addVariableLengthEntry(EXIF_IFD_GPS, refTag, EXIF_FORMAT_ASCII, 2, 2); 538 if (!refEntry) { 539 ALOGE("%s: Adding GPSLatitudeRef exif entry failed", __FUNCTION__); 540 return false; 541 } 542 if (latitude >= 0) { 543 memcpy(refEntry->data, "N", sizeof("N")); 544 } else { 545 memcpy(refEntry->data, "S", sizeof("S")); 546 latitude *= -1; 547 } 548 549 const ExifTag tag = static_cast<ExifTag>(EXIF_TAG_GPS_LATITUDE); 550 std::unique_ptr<ExifEntry> entry = addVariableLengthEntry( 551 EXIF_IFD_GPS, tag, EXIF_FORMAT_RATIONAL, 3, 3 * sizeof(ExifRational)); 552 if (!entry) { 553 exif_content_remove_entry(exif_data_->ifd[EXIF_IFD_GPS], refEntry.get()); 554 ALOGE("%s: Adding GPSLatitude exif entry failed", __FUNCTION__); 555 return false; 556 } 557 setLatitudeOrLongitudeData(entry->data, latitude); 558 559 return true; 560 } 561 562 bool ExifUtilsImpl::setGpsLongitude(double longitude) { 563 ExifTag refTag = static_cast<ExifTag>(EXIF_TAG_GPS_LONGITUDE_REF); 564 std::unique_ptr<ExifEntry> refEntry = 565 addVariableLengthEntry(EXIF_IFD_GPS, refTag, EXIF_FORMAT_ASCII, 2, 2); 566 if (!refEntry) { 567 ALOGE("%s: Adding GPSLongitudeRef exif entry failed", __FUNCTION__); 568 return false; 569 } 570 if (longitude >= 0) { 571 memcpy(refEntry->data, "E", sizeof("E")); 572 } else { 573 memcpy(refEntry->data, "W", sizeof("W")); 574 longitude *= -1; 575 } 576 577 ExifTag tag = static_cast<ExifTag>(EXIF_TAG_GPS_LONGITUDE); 578 std::unique_ptr<ExifEntry> entry = addVariableLengthEntry( 579 EXIF_IFD_GPS, tag, EXIF_FORMAT_RATIONAL, 3, 3 * sizeof(ExifRational)); 580 if (!entry) { 581 exif_content_remove_entry(exif_data_->ifd[EXIF_IFD_GPS], refEntry.get()); 582 ALOGE("%s: Adding GPSLongitude exif entry failed", __FUNCTION__); 583 return false; 584 } 585 setLatitudeOrLongitudeData(entry->data, longitude); 586 587 return true; 588 } 589 590 bool ExifUtilsImpl::setGpsProcessingMethod(const std::string& method) { 591 std::string buffer = 592 std::string(gExifAsciiPrefix, sizeof(gExifAsciiPrefix)) + method; 593 SET_STRING(EXIF_IFD_GPS, static_cast<ExifTag>(EXIF_TAG_GPS_PROCESSING_METHOD), 594 EXIF_FORMAT_UNDEFINED, buffer); 595 return true; 596 } 597 598 bool ExifUtilsImpl::setGpsTimestamp(const struct tm& t) { 599 const ExifTag dateTag = static_cast<ExifTag>(EXIF_TAG_GPS_DATE_STAMP); 600 const size_t kGpsDateStampSize = 11; 601 std::unique_ptr<ExifEntry> entry = 602 addVariableLengthEntry(EXIF_IFD_GPS, dateTag, EXIF_FORMAT_ASCII, 603 kGpsDateStampSize, kGpsDateStampSize); 604 if (!entry) { 605 ALOGE("%s: Adding GPSDateStamp exif entry failed", __FUNCTION__); 606 return false; 607 } 608 int result = 609 snprintf(reinterpret_cast<char*>(entry->data), kGpsDateStampSize, 610 "%04i:%02i:%02i", t.tm_year + 1900, t.tm_mon + 1, t.tm_mday); 611 if (result != kGpsDateStampSize - 1) { 612 ALOGW("%s: Input time is invalid", __FUNCTION__); 613 return false; 614 } 615 616 const ExifTag timeTag = static_cast<ExifTag>(EXIF_TAG_GPS_TIME_STAMP); 617 entry = addVariableLengthEntry(EXIF_IFD_GPS, timeTag, EXIF_FORMAT_RATIONAL, 3, 618 3 * sizeof(ExifRational)); 619 if (!entry) { 620 ALOGE("%s: Adding GPSTimeStamp exif entry failed", __FUNCTION__); 621 return false; 622 } 623 exif_set_rational(entry->data, EXIF_BYTE_ORDER_INTEL, 624 {static_cast<ExifLong>(t.tm_hour), 1}); 625 exif_set_rational(entry->data + sizeof(ExifRational), EXIF_BYTE_ORDER_INTEL, 626 {static_cast<ExifLong>(t.tm_min), 1}); 627 exif_set_rational(entry->data + 2 * sizeof(ExifRational), 628 EXIF_BYTE_ORDER_INTEL, 629 {static_cast<ExifLong>(t.tm_sec), 1}); 630 631 return true; 632 } 633 634 bool ExifUtilsImpl::setImageHeight(uint32_t length) { 635 SET_LONG(EXIF_IFD_0, EXIF_TAG_IMAGE_LENGTH, length); 636 SET_LONG(EXIF_IFD_EXIF, EXIF_TAG_PIXEL_Y_DIMENSION, length); 637 return true; 638 } 639 640 bool ExifUtilsImpl::setImageWidth(uint32_t width) { 641 SET_LONG(EXIF_IFD_0, EXIF_TAG_IMAGE_WIDTH, width); 642 SET_LONG(EXIF_IFD_EXIF, EXIF_TAG_PIXEL_X_DIMENSION, width); 643 return true; 644 } 645 646 bool ExifUtilsImpl::setIsoSpeedRating(uint16_t iso_speed_ratings) { 647 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_ISO_SPEED_RATINGS, iso_speed_ratings); 648 return true; 649 } 650 651 bool ExifUtilsImpl::setLightSource(uint16_t light_source) { 652 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_LIGHT_SOURCE, light_source); 653 return true; 654 } 655 656 bool ExifUtilsImpl::setMaxAperture(uint32_t numerator, uint32_t denominator) { 657 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_MAX_APERTURE_VALUE, numerator, 658 denominator); 659 return true; 660 } 661 662 bool ExifUtilsImpl::setMeteringMode(uint16_t metering_mode) { 663 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_METERING_MODE, metering_mode); 664 return true; 665 } 666 667 bool ExifUtilsImpl::setOrientation(uint16_t orientation) { 668 /* 669 * Orientation value: 670 * 1 2 3 4 5 6 7 8 671 * 672 * 888888 888888 88 88 8888888888 88 88 8888888888 673 * 88 88 88 88 88 88 88 88 88 88 88 88 674 * 8888 8888 8888 8888 88 8888888888 8888888888 88 675 * 88 88 88 88 676 * 88 88 888888 888888 677 */ 678 int value = 1; 679 switch (orientation) { 680 case 90: 681 value = 6; 682 break; 683 case 180: 684 value = 3; 685 break; 686 case 270: 687 value = 8; 688 break; 689 default: 690 break; 691 } 692 SET_SHORT(EXIF_IFD_0, EXIF_TAG_ORIENTATION, value); 693 return true; 694 } 695 696 bool ExifUtilsImpl::setResolutionUnit(uint16_t resolution_unit) { 697 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_RESOLUTION_UNIT, resolution_unit); 698 return true; 699 } 700 701 bool ExifUtilsImpl::setSaturation(uint16_t saturation) { 702 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_SATURATION, saturation); 703 return true; 704 } 705 706 bool ExifUtilsImpl::setSceneCaptureType(uint16_t type) { 707 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_SCENE_CAPTURE_TYPE, type); 708 return true; 709 } 710 711 bool ExifUtilsImpl::setSharpness(uint16_t sharpness) { 712 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_SHARPNESS, sharpness); 713 return true; 714 } 715 716 bool ExifUtilsImpl::setShutterSpeed(int32_t numerator, int32_t denominator) { 717 SET_SRATIONAL(EXIF_IFD_EXIF, EXIF_TAG_SHUTTER_SPEED_VALUE, numerator, 718 denominator); 719 return true; 720 } 721 722 bool ExifUtilsImpl::setSubjectDistance(uint32_t numerator, uint32_t denominator) { 723 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_SUBJECT_DISTANCE, numerator, 724 denominator); 725 return true; 726 } 727 728 bool ExifUtilsImpl::setSubsecTime(const std::string& subsec_time) { 729 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_SUB_SEC_TIME, EXIF_FORMAT_ASCII, 730 subsec_time); 731 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_SUB_SEC_TIME_ORIGINAL, EXIF_FORMAT_ASCII, 732 subsec_time); 733 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_SUB_SEC_TIME_DIGITIZED, EXIF_FORMAT_ASCII, 734 subsec_time); 735 return true; 736 } 737 738 bool ExifUtilsImpl::setWhiteBalance(uint16_t white_balance) { 739 SET_SHORT(EXIF_IFD_EXIF, EXIF_TAG_WHITE_BALANCE, white_balance); 740 return true; 741 } 742 743 bool ExifUtilsImpl::setXResolution(uint32_t numerator, uint32_t denominator) { 744 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_X_RESOLUTION, numerator, denominator); 745 return true; 746 } 747 748 bool ExifUtilsImpl::setYCbCrPositioning(uint16_t ycbcr_positioning) { 749 SET_SHORT(EXIF_IFD_0, EXIF_TAG_YCBCR_POSITIONING, ycbcr_positioning); 750 return true; 751 } 752 753 bool ExifUtilsImpl::setYResolution(uint32_t numerator, uint32_t denominator) { 754 SET_RATIONAL(EXIF_IFD_EXIF, EXIF_TAG_Y_RESOLUTION, numerator, denominator); 755 return true; 756 } 757 758 bool ExifUtilsImpl::generateApp1(const void* thumbnail_buffer, uint32_t size) { 759 destroyApp1(); 760 exif_data_->data = const_cast<uint8_t*>(static_cast<const uint8_t*>(thumbnail_buffer)); 761 exif_data_->size = size; 762 // Save the result into |app1_buffer_|. 763 exif_data_save_data(exif_data_, &app1_buffer_, &app1_length_); 764 if (!app1_length_) { 765 ALOGE("%s: Allocate memory for app1_buffer_ failed", __FUNCTION__); 766 return false; 767 } 768 /* 769 * The JPEG segment size is 16 bits in spec. The size of APP1 segment should 770 * be smaller than 65533 because there are two bytes for segment size field. 771 */ 772 if (app1_length_ > 65533) { 773 destroyApp1(); 774 ALOGE("%s: The size of APP1 segment is too large", __FUNCTION__); 775 return false; 776 } 777 return true; 778 } 779 780 const uint8_t* ExifUtilsImpl::getApp1Buffer() { 781 return app1_buffer_; 782 } 783 784 unsigned int ExifUtilsImpl::getApp1Length() { 785 return app1_length_; 786 } 787 788 bool ExifUtilsImpl::setExifVersion(const std::string& exif_version) { 789 SET_STRING(EXIF_IFD_EXIF, EXIF_TAG_EXIF_VERSION, EXIF_FORMAT_UNDEFINED, exif_version); 790 return true; 791 } 792 793 bool ExifUtilsImpl::setMake(const std::string& make) { 794 SET_STRING(EXIF_IFD_0, EXIF_TAG_MAKE, EXIF_FORMAT_ASCII, make); 795 return true; 796 } 797 798 bool ExifUtilsImpl::setModel(const std::string& model) { 799 SET_STRING(EXIF_IFD_0, EXIF_TAG_MODEL, EXIF_FORMAT_ASCII, model); 800 return true; 801 } 802 803 void ExifUtilsImpl::reset() { 804 destroyApp1(); 805 if (exif_data_) { 806 /* 807 * Since we decided to ignore the original APP1, we are sure that there is 808 * no thumbnail allocated by libexif. |exif_data_->data| is actually 809 * allocated by JpegCompressor. sets |exif_data_->data| to nullptr to 810 * prevent exif_data_unref() destroy it incorrectly. 811 */ 812 exif_data_->data = nullptr; 813 exif_data_->size = 0; 814 exif_data_unref(exif_data_); 815 exif_data_ = nullptr; 816 } 817 } 818 819 std::unique_ptr<ExifEntry> ExifUtilsImpl::addVariableLengthEntry(ExifIfd ifd, 820 ExifTag tag, 821 ExifFormat format, 822 uint64_t components, 823 unsigned int size) { 824 // Remove old entry if exists. 825 exif_content_remove_entry(exif_data_->ifd[ifd], 826 exif_content_get_entry(exif_data_->ifd[ifd], tag)); 827 ExifMem* mem = exif_mem_new_default(); 828 if (!mem) { 829 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__); 830 return nullptr; 831 } 832 std::unique_ptr<ExifEntry> entry(exif_entry_new_mem(mem)); 833 if (!entry) { 834 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__); 835 exif_mem_unref(mem); 836 return nullptr; 837 } 838 void* tmpBuffer = exif_mem_alloc(mem, size); 839 if (!tmpBuffer) { 840 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__); 841 exif_mem_unref(mem); 842 return nullptr; 843 } 844 845 entry->data = static_cast<unsigned char*>(tmpBuffer); 846 entry->tag = tag; 847 entry->format = format; 848 entry->components = components; 849 entry->size = size; 850 851 exif_content_add_entry(exif_data_->ifd[ifd], entry.get()); 852 exif_mem_unref(mem); 853 854 return entry; 855 } 856 857 std::unique_ptr<ExifEntry> ExifUtilsImpl::addEntry(ExifIfd ifd, ExifTag tag) { 858 std::unique_ptr<ExifEntry> entry(exif_content_get_entry(exif_data_->ifd[ifd], tag)); 859 if (entry) { 860 // exif_content_get_entry() won't ref the entry, so we ref here. 861 exif_entry_ref(entry.get()); 862 return entry; 863 } 864 entry.reset(exif_entry_new()); 865 if (!entry) { 866 ALOGE("%s: Allocate memory for exif entry failed", __FUNCTION__); 867 return nullptr; 868 } 869 entry->tag = tag; 870 exif_content_add_entry(exif_data_->ifd[ifd], entry.get()); 871 exif_entry_initialize(entry.get(), tag); 872 return entry; 873 } 874 875 bool ExifUtilsImpl::setShort(ExifIfd ifd, 876 ExifTag tag, 877 uint16_t value, 878 const std::string& msg) { 879 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag); 880 if (!entry) { 881 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str()); 882 return false; 883 } 884 exif_set_short(entry->data, EXIF_BYTE_ORDER_INTEL, value); 885 return true; 886 } 887 888 bool ExifUtilsImpl::setLong(ExifIfd ifd, 889 ExifTag tag, 890 uint32_t value, 891 const std::string& msg) { 892 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag); 893 if (!entry) { 894 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str()); 895 return false; 896 } 897 exif_set_long(entry->data, EXIF_BYTE_ORDER_INTEL, value); 898 return true; 899 } 900 901 bool ExifUtilsImpl::setRational(ExifIfd ifd, 902 ExifTag tag, 903 uint32_t numerator, 904 uint32_t denominator, 905 const std::string& msg) { 906 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag); 907 if (!entry) { 908 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str()); 909 return false; 910 } 911 exif_set_rational(entry->data, EXIF_BYTE_ORDER_INTEL, 912 {numerator, denominator}); 913 return true; 914 } 915 916 bool ExifUtilsImpl::setSRational(ExifIfd ifd, 917 ExifTag tag, 918 int32_t numerator, 919 int32_t denominator, 920 const std::string& msg) { 921 std::unique_ptr<ExifEntry> entry = addEntry(ifd, tag); 922 if (!entry) { 923 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str()); 924 return false; 925 } 926 exif_set_srational(entry->data, EXIF_BYTE_ORDER_INTEL, 927 {numerator, denominator}); 928 return true; 929 } 930 931 bool ExifUtilsImpl::setString(ExifIfd ifd, 932 ExifTag tag, 933 ExifFormat format, 934 const std::string& buffer, 935 const std::string& msg) { 936 size_t entry_size = buffer.length(); 937 // Since the exif format is undefined, NULL termination is not necessary. 938 if (format == EXIF_FORMAT_ASCII) { 939 entry_size++; 940 } 941 std::unique_ptr<ExifEntry> entry = 942 addVariableLengthEntry(ifd, tag, format, entry_size, entry_size); 943 if (!entry) { 944 ALOGE("%s: Adding '%s' entry failed", __FUNCTION__, msg.c_str()); 945 return false; 946 } 947 memcpy(entry->data, buffer.c_str(), entry_size); 948 return true; 949 } 950 951 void ExifUtilsImpl::destroyApp1() { 952 /* 953 * Since there is no API to access ExifMem in ExifData->priv, we use free 954 * here, which is the default free function in libexif. See 955 * exif_data_save_data() for detail. 956 */ 957 free(app1_buffer_); 958 app1_buffer_ = nullptr; 959 app1_length_ = 0; 960 } 961 962 bool ExifUtilsImpl::setFromMetadata(const CameraMetadata& metadata, 963 const size_t imageWidth, 964 const size_t imageHeight) { 965 // How precise the float-to-rational conversion for EXIF tags would be. 966 constexpr int kRationalPrecision = 10000; 967 if (!setImageWidth(imageWidth) || 968 !setImageHeight(imageHeight)) { 969 ALOGE("%s: setting image resolution failed.", __FUNCTION__); 970 return false; 971 } 972 973 struct timespec tp; 974 struct tm time_info; 975 bool time_available = clock_gettime(CLOCK_REALTIME, &tp) != -1; 976 localtime_r(&tp.tv_sec, &time_info); 977 if (!setDateTime(time_info)) { 978 ALOGE("%s: setting data time failed.", __FUNCTION__); 979 return false; 980 } 981 982 float focal_length; 983 camera_metadata_ro_entry entry = metadata.find(ANDROID_LENS_FOCAL_LENGTH); 984 if (entry.count) { 985 focal_length = entry.data.f[0]; 986 987 if (!setFocalLength( 988 static_cast<uint32_t>(focal_length * kRationalPrecision), 989 kRationalPrecision)) { 990 ALOGE("%s: setting focal length failed.", __FUNCTION__); 991 return false; 992 } 993 } else { 994 ALOGV("%s: Cannot find focal length in metadata.", __FUNCTION__); 995 } 996 997 if (metadata.exists(ANDROID_JPEG_GPS_COORDINATES)) { 998 entry = metadata.find(ANDROID_JPEG_GPS_COORDINATES); 999 if (entry.count < 3) { 1000 ALOGE("%s: Gps coordinates in metadata is not complete.", __FUNCTION__); 1001 return false; 1002 } 1003 if (!setGpsLatitude(entry.data.d[0])) { 1004 ALOGE("%s: setting gps latitude failed.", __FUNCTION__); 1005 return false; 1006 } 1007 if (!setGpsLongitude(entry.data.d[1])) { 1008 ALOGE("%s: setting gps longitude failed.", __FUNCTION__); 1009 return false; 1010 } 1011 if (!setGpsAltitude(entry.data.d[2])) { 1012 ALOGE("%s: setting gps altitude failed.", __FUNCTION__); 1013 return false; 1014 } 1015 } 1016 1017 if (metadata.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 1018 entry = metadata.find(ANDROID_JPEG_GPS_PROCESSING_METHOD); 1019 std::string method_str(reinterpret_cast<const char*>(entry.data.u8)); 1020 if (!setGpsProcessingMethod(method_str)) { 1021 ALOGE("%s: setting gps processing method failed.", __FUNCTION__); 1022 return false; 1023 } 1024 } 1025 1026 if (time_available && metadata.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 1027 entry = metadata.find(ANDROID_JPEG_GPS_TIMESTAMP); 1028 time_t timestamp = static_cast<time_t>(entry.data.i64[0]); 1029 if (gmtime_r(×tamp, &time_info)) { 1030 if (!setGpsTimestamp(time_info)) { 1031 ALOGE("%s: setting gps timestamp failed.", __FUNCTION__); 1032 return false; 1033 } 1034 } else { 1035 ALOGE("%s: Time tranformation failed.", __FUNCTION__); 1036 return false; 1037 } 1038 } 1039 1040 if (metadata.exists(ANDROID_JPEG_ORIENTATION)) { 1041 entry = metadata.find(ANDROID_JPEG_ORIENTATION); 1042 if (!setOrientation(entry.data.i32[0])) { 1043 ALOGE("%s: setting orientation failed.", __FUNCTION__); 1044 return false; 1045 } 1046 } 1047 1048 if (metadata.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 1049 entry = metadata.find(ANDROID_SENSOR_EXPOSURE_TIME); 1050 // int64_t of nanoseconds 1051 if (!setExposureTime(entry.data.i64[0],1000000000u)) { 1052 ALOGE("%s: setting exposure time failed.", __FUNCTION__); 1053 return false; 1054 } 1055 } 1056 1057 if (metadata.exists(ANDROID_LENS_APERTURE)) { 1058 const int kAperturePrecision = 10000; 1059 entry = metadata.find(ANDROID_LENS_APERTURE); 1060 if (!setFNumber(entry.data.f[0] * kAperturePrecision, 1061 kAperturePrecision)) { 1062 ALOGE("%s: setting F number failed.", __FUNCTION__); 1063 return false; 1064 } 1065 } 1066 1067 if (metadata.exists(ANDROID_FLASH_INFO_AVAILABLE)) { 1068 entry = metadata.find(ANDROID_FLASH_INFO_AVAILABLE); 1069 if (entry.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_FALSE) { 1070 const uint32_t kNoFlashFunction = 0x20; 1071 if (!setFlash(kNoFlashFunction)) { 1072 ALOGE("%s: setting flash failed.", __FUNCTION__); 1073 return false; 1074 } 1075 } else { 1076 ALOGE("%s: Unsupported flash info: %d",__FUNCTION__, entry.data.u8[0]); 1077 return false; 1078 } 1079 } 1080 1081 if (metadata.exists(ANDROID_CONTROL_AWB_MODE)) { 1082 entry = metadata.find(ANDROID_CONTROL_AWB_MODE); 1083 if (entry.data.u8[0] == ANDROID_CONTROL_AWB_MODE_AUTO) { 1084 const uint16_t kAutoWhiteBalance = 0; 1085 if (!setWhiteBalance(kAutoWhiteBalance)) { 1086 ALOGE("%s: setting white balance failed.", __FUNCTION__); 1087 return false; 1088 } 1089 } else { 1090 ALOGE("%s: Unsupported awb mode: %d", __FUNCTION__, entry.data.u8[0]); 1091 return false; 1092 } 1093 } 1094 1095 if (time_available) { 1096 char str[4]; 1097 if (snprintf(str, sizeof(str), "%03ld", tp.tv_nsec / 1000000) < 0) { 1098 ALOGE("%s: Subsec is invalid: %ld", __FUNCTION__, tp.tv_nsec); 1099 return false; 1100 } 1101 if (!setSubsecTime(std::string(str))) { 1102 ALOGE("%s: setting subsec time failed.", __FUNCTION__); 1103 return false; 1104 } 1105 } 1106 1107 return true; 1108 } 1109 1110 } // namespace helper 1111 } // namespace V1_0 1112 } // namespace common 1113 } // namespace camera 1114 } // namespace hardware 1115 } // namespace android 1116