• Home
  • 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     if (metadata.exists(ANDROID_SCALER_CROP_REGION) &&
920             staticInfo.exists(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE)) {
921         entry = metadata.find(ANDROID_SCALER_CROP_REGION);
922         camera_metadata_ro_entry activeArrayEntry =
923                 staticInfo.find(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
924 
925         if (!setDigitalZoomRatio(entry.data.i32[2], entry.data.i32[3],
926                 activeArrayEntry.data.i32[2], activeArrayEntry.data.i32[3])) {
927             ALOGE("%s: setting digital zoom ratio failed.", __FUNCTION__);
928             return false;
929         }
930     }
931 
932     if (metadata.exists(ANDROID_JPEG_GPS_COORDINATES)) {
933         entry = metadata.find(ANDROID_JPEG_GPS_COORDINATES);
934         if (entry.count < 3) {
935             ALOGE("%s: Gps coordinates in metadata is not complete.", __FUNCTION__);
936             return false;
937         }
938         if (!setGpsLatitude(entry.data.d[0])) {
939             ALOGE("%s: setting gps latitude failed.", __FUNCTION__);
940             return false;
941         }
942         if (!setGpsLongitude(entry.data.d[1])) {
943             ALOGE("%s: setting gps longitude failed.", __FUNCTION__);
944             return false;
945         }
946         if (!setGpsAltitude(entry.data.d[2])) {
947             ALOGE("%s: setting gps altitude failed.", __FUNCTION__);
948             return false;
949         }
950     }
951 
952     if (metadata.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
953         entry = metadata.find(ANDROID_JPEG_GPS_PROCESSING_METHOD);
954         std::string method_str(reinterpret_cast<const char*>(entry.data.u8));
955         if (!setGpsProcessingMethod(method_str)) {
956             ALOGE("%s: setting gps processing method failed.", __FUNCTION__);
957             return false;
958         }
959     }
960 
961     if (time_available && metadata.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
962         entry = metadata.find(ANDROID_JPEG_GPS_TIMESTAMP);
963         time_t timestamp = static_cast<time_t>(entry.data.i64[0]);
964         if (gmtime_r(&timestamp, &time_info)) {
965             if (!setGpsTimestamp(time_info)) {
966                 ALOGE("%s: setting gps timestamp failed.", __FUNCTION__);
967                 return false;
968             }
969         } else {
970             ALOGE("%s: Time tranformation failed.", __FUNCTION__);
971             return false;
972         }
973     }
974 
975     if (staticInfo.exists(ANDROID_CONTROL_AE_COMPENSATION_STEP) &&
976             metadata.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
977         entry = metadata.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION);
978         camera_metadata_ro_entry stepEntry =
979                 staticInfo.find(ANDROID_CONTROL_AE_COMPENSATION_STEP);
980         if (!setExposureBias(entry.data.i32[0], stepEntry.data.r[0].numerator,
981                 stepEntry.data.r[0].denominator)) {
982             ALOGE("%s: setting exposure bias failed.", __FUNCTION__);
983             return false;
984         }
985     }
986 
987     if (metadata.exists(ANDROID_JPEG_ORIENTATION)) {
988         entry = metadata.find(ANDROID_JPEG_ORIENTATION);
989         if (!setOrientation(entry.data.i32[0])) {
990             ALOGE("%s: setting orientation failed.", __FUNCTION__);
991             return false;
992         }
993     }
994 
995     if (metadata.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
996         entry = metadata.find(ANDROID_SENSOR_EXPOSURE_TIME);
997         float exposure_time = 1.0f * entry.data.i64[0] / 1e9;
998         if (!setExposureTime(exposure_time)) {
999             ALOGE("%s: setting exposure time failed.", __FUNCTION__);
1000             return false;
1001         }
1002 
1003         if (!setShutterSpeed(exposure_time)) {
1004             ALOGE("%s: setting shutter speed failed.", __FUNCTION__);
1005             return false;
1006         }
1007     }
1008 
1009     if (metadata.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
1010         entry = metadata.find(ANDROID_LENS_FOCUS_DISTANCE);
1011         if (!setSubjectDistance(entry.data.f[0])) {
1012             ALOGE("%s: setting subject distance failed.", __FUNCTION__);
1013             return false;
1014         }
1015     }
1016 
1017     if (metadata.exists(ANDROID_SENSOR_SENSITIVITY)) {
1018         entry = metadata.find(ANDROID_SENSOR_SENSITIVITY);
1019         int32_t iso = entry.data.i32[0];
1020         camera_metadata_ro_entry postRawSensEntry =
1021                 metadata.find(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST);
1022         if (postRawSensEntry.count > 0) {
1023             iso = iso * postRawSensEntry.data.i32[0] / 100;
1024         }
1025 
1026         if (!setIsoSpeedRating(static_cast<uint16_t>(iso))) {
1027             ALOGE("%s: setting iso rating failed.", __FUNCTION__);
1028             return false;
1029         }
1030     }
1031 
1032     if (metadata.exists(ANDROID_LENS_APERTURE)) {
1033         entry = metadata.find(ANDROID_LENS_APERTURE);
1034         if (!setFNumber(entry.data.f[0])) {
1035             ALOGE("%s: setting F number failed.", __FUNCTION__);
1036             return false;
1037         }
1038         if (!setAperture(entry.data.f[0])) {
1039             ALOGE("%s: setting aperture failed.", __FUNCTION__);
1040             return false;
1041         }
1042     }
1043 
1044     static const uint16_t kSRGBColorSpace = 1;
1045     if (!setColorSpace(kSRGBColorSpace)) {
1046         ALOGE("%s: setting color space failed.", __FUNCTION__);
1047         return false;
1048     }
1049 
1050     if (staticInfo.exists(ANDROID_LENS_INFO_AVAILABLE_APERTURES)) {
1051         entry = staticInfo.find(ANDROID_LENS_INFO_AVAILABLE_APERTURES);
1052         if (!setMaxAperture(entry.data.f[0])) {
1053             ALOGE("%s: setting max aperture failed.", __FUNCTION__);
1054             return false;
1055         }
1056     }
1057 
1058     if (staticInfo.exists(ANDROID_FLASH_INFO_AVAILABLE)) {
1059         entry = staticInfo.find(ANDROID_FLASH_INFO_AVAILABLE);
1060         camera_metadata_ro_entry flashStateEntry = metadata.find(ANDROID_FLASH_STATE);
1061         camera_metadata_ro_entry aeModeEntry = metadata.find(ANDROID_CONTROL_AE_MODE);
1062         uint8_t flashState = flashStateEntry.count > 0 ?
1063                 flashStateEntry.data.u8[0] : ANDROID_FLASH_STATE_UNAVAILABLE;
1064         uint8_t aeMode = aeModeEntry.count > 0 ?
1065                 aeModeEntry.data.u8[0] : ANDROID_CONTROL_AE_MODE_OFF;
1066 
1067         if (!setFlash(entry.data.u8[0], flashState, aeMode)) {
1068             ALOGE("%s: setting flash failed.", __FUNCTION__);
1069             return false;
1070         }
1071     }
1072 
1073     if (metadata.exists(ANDROID_CONTROL_AWB_MODE)) {
1074         entry = metadata.find(ANDROID_CONTROL_AWB_MODE);
1075         if (!setWhiteBalance(entry.data.u8[0])) {
1076             ALOGE("%s: setting white balance failed.", __FUNCTION__);
1077             return false;
1078         }
1079     }
1080 
1081     if (metadata.exists(ANDROID_CONTROL_AE_MODE)) {
1082         entry = metadata.find(ANDROID_CONTROL_AE_MODE);
1083         if (!setExposureMode(entry.data.u8[0])) {
1084             ALOGE("%s: setting exposure mode failed.", __FUNCTION__);
1085             return false;
1086         }
1087     }
1088     if (time_available) {
1089         char str[4];
1090         if (snprintf(str, sizeof(str), "%03ld", tp.tv_nsec / 1000000) < 0) {
1091             ALOGE("%s: Subsec is invalid: %ld", __FUNCTION__, tp.tv_nsec);
1092             return false;
1093         }
1094         if (!setSubsecTime(std::string(str))) {
1095             ALOGE("%s: setting subsec time failed.", __FUNCTION__);
1096             return false;
1097         }
1098     }
1099 
1100     return true;
1101 }
1102 
1103 } // namespace camera3
1104 } // namespace android
1105