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